Pitanje:
Je li moguće sakriti detalje koji je kompajler korišten?
asheeshr
2013-03-23 08:47:10 UTC
view on stackexchange narkive permalink

Kompajler dodaje sistemske informacije u izlaznu / objektnu datoteku koja se kreira na kompilaciji.

  • Postoji li opcija kompajlera koja može spriječiti dodavanje ovih podataka?
  • Može li se potpis kompajlera potpuno ukloniti kako bi otkrivanje korištenog kompajlera bilo teško / nevjerojatno?
Rastrgan sam. To nije * točan * duplikat [ovog pitanja] (http://reverseengineering.stackexchange.com/questions/11), ali postoji puno zajedničkog, a odgovori će biti gotovo isti ...
@IgorSkochinsky, me ispravio ako griješim, ali niti jedan od odgovora u pitanju na koje se referirate ne raspravlja o tome kako ukloniti ili zamutiti atribute kompajlera, već je raspravio da oni postoje.
Pet odgovori:
#1
+8
Rolf Rolles
2013-03-23 12:34:21 UTC
view on stackexchange narkive permalink

Moj odgovor ovdje specifičan je za uobičajene C / C ++ kompajlere, ali principi koji stoje iza odgovora generaliziraju se na druge scenarije.

Razlike u sastavljaču očituju se na mnogo načina, od kojih su neki vrlo suptilni. Ako se striktno radilo o atributima u izvršnom zaglavlju, tada bismo lako mogli zamisliti da prepišemo navedeno zaglavlje. Međutim, svaki kompajler ima svoj jedinstveni okus generiranog koda (i koji varira ovisno o razini optimizacije). Svaki kompajler ima svoju zadanu standardnu ​​biblioteku (koja često uključuje kontrolne nizove) i različiti zadani standardni obrazac na ulaznoj točki izvršne datoteke. Postoje i druge razlike kao što su: optimizacije korištene u jednom kompajleru koje se ne koriste u drugom; zadana konvencija pozivanja može se razlikovati; kod generiran za prologe funkcija zamjetno se razlikuje na gcc-u i MSVC-u (na primjer); različiti kompajleri imaju različite sekvence koda i strukture podataka za rukovanje iznimkama; i još mnogo primjera. Rekao bih da je praktički nemoguće prikriti koji je kompajler proizveo datu izvršnu datoteku.

#2
+4
omghai2u
2013-03-23 14:04:30 UTC
view on stackexchange narkive permalink

Da odgovorim na vaše prvo pitanje: Ne, mislim da ne postoje opcije kompajlera za popularne kompajlere koje vam omogućuju da spriječite dodavanje artefakata kompajlera.

Dio problema u ovome je istražen odgovorom @ Syzygy: sastavljači generiraju, ponekad, vrlo različite upute.

Ipak, i više od toga, poznavanje artefakata koje su ostavili različiti kompajleri omogućuje vam da otežate razlikovanje korištenog kompajlera. Na primjer, zamislite da sastavite svoju izvršnu datoteku za Windows s mingw, ali zatim dodajte RICH zaglavlje. Ovo je izmišljeni primjer, ali dodavanjem ovog artefakta MSVC kompajlera na izlaz mingw vjerojatno bi zbunio neke automatizirane alate.

#3
+4
George V. Williams
2013-03-29 23:06:40 UTC
view on stackexchange narkive permalink

Mnogi od prethodnih odgovora primijetili su da je to nemoguće jer će prevoditelj uvijek iza sebe ostavljati artefakte. Odlučio sam izvesti malu studiju slučaja pomoću programa na Linuxu, iako je ideja prenosiva.

Na primjer, stvorio sam mali "Hello World!" datoteka u C:

  #include <stdio.h>int main (void) {put ("Hello World!"); return 0;}  

Tada sam ga kompajlirao i koristio hexdump -C na rezultatima. Sljedeće osim prilično jasno identificira kompajler!

  00001020 47 43 43 3a 20 28 55 62 75 6e 74 75 2f 4c 69 6e | GCC: (Ubuntu / Lin | 00001030 61 72 6f 20 34 2e 36 2e 33 2d 31 75 62 75 6e 74 | aro 4.6.3-1ubunt | 00001040 75 35 29 20 34 2e 36 2e 33 00 00 2e 73 79 6d 74 | u5) 4.6.3 ... symt | 00001050 61 62 00 2e 73 74 72 74 61 62 00 2e 73 68 73 74 | ab..strtab..shst | 00001060 72 74 61 62 00 2e 69 6e 74 65 72 70 00 2e 6e 6f | rtab..interp..no | 00001070 74 65 2e 41 42 49 2d 74 61 67 00 2e 6e 6f 74 65 | te.ABI-tag..note | 00001080 2e 67 6e 75 2e 62 75 69 6c 64 2d 69 64 00 2e 67 | .gnu.build-id ..g | 00001090 6e 75 2e 68 61 73 68 00 2e 64 79 6e 73 79 6d 00 | nu.hash..dynsym. | 000010a0 2e 64 79 6e 73 74 72 00 2e 67 6e 75 2e 76 65 72 | .dynstr ..gnu.ver | 000010b0 73 69 6f 6e 00 2e 67 6e 75 2e 76 65 72 73 69 6f | sion..gnu.versio | 000010c0 6e 5f 72 00 2e 72 65 6c 61 2e 64 79 6e 00 2e 72 | n_r ..rela.dyn..r | 000010d0 65 6c 61 2e 70 6c 74 00 2e 69 6e 69 74 00 2e 74 | ela.pl t..init..t | 000010e0 65 78 74 00 2e 66 69 6e 69 00 2e 72 6f 64 61 74 | van..fini..rodat | 000010f0 61 00 2e 65 68 5f 66 72 61 6d 65 5f 68 64 72 00 | a..eh_frame_hdr. | 00001100 2e 65 68 5f 66 72 61 6d 65 00 2e 63 74 6f 72 73 | .eh_frame..ctors | 00001110 00 2e 64 74 6f 72 73 00 2e 6a 63 72 00 2e 64 79 | ..dtors..jcr..dy | 00001120 6e 61 6d 69 63 00 2e 67 6f 74 00 2e 67 6f 74 2e | namic..got..got. | 00001130 70 6c 74 00 2e 64 61 74 61 00 2e 62 73 73 00 2e | plt..data..bss .. |
00001140 63 6f 6d 6d 65 6e 74 00 00 00 00 00 00 00 00 | komentar ......... |  

Pokretanje strip -R .comment djelomično pomaže i u potpunosti uklanja izričito spominjanje GCC-a, ali još uvijek postoje neki znakovi:

  00000260 47 4e 55 00 00 00 00 00 02 00 00 00 00 00 00 00 | GNU ............. | 00000270 18 00 00 00 04 00 00 00 14 00 00 00 03 00 00 00 | ............... . | 00000280 47 4e 55 00 5f 8a 1b 97 01 5a ac d7 93 fb 96 29 | GNU ._.... Z .....) | * * * 00000310 00 00 00 00 00 00 00 00 00 5f 5f 67 6d 6f 6e 5f | .........__ gmon_ | 00000320 73 74 61 72 74 5f 5f 00 6c 69 62 63 2e 73 6f 2e | početak __. Libc.so. | 00000330 36 00 70 75 74 73 00 5f 5f 6c 69 62 63 5f 73 74 | 6.ulazi .__ libc_st | 00000340 61 72 74 5f 6d 61 69 6e 00 47 4c 49 42 43 5f 32 | art_main.GLIBC_2 | 00000350 2e 32 2e 35 00 00 00 00 02 00 02 00 00 00 00 00 | .2.5 ............ | * * * 00001020 00 2e 73 68 73 74 72 74 61 62 00 2e 69 6e 74 65 | ..shstrtab..inte | 00001030 72 70 00 2e 6e 6f 74 65 2e 41 42 49 2d 74 61 67 | rp..note.ABI-tag | 00001040 00 2e 6e 6f 74 65 2e 67 6e 75 2e 62 75 69 6c 64 | ..note.gnu.build | 00001050 2d 69 64 00 2e 67 6e 75 2e 68 61 73 68 00 2e 64 | -id..gnu.hash..d | 00001060 79 6e 73 79 6d 00 2e 64 79 6e 73 74 72 00 2e 67 | ynsym..dynstr..g | 00001070 6e 75 2e 76 65 72 73 69 6f 6e 00 2e 67 6e 75 2e | nu.verzija..gnu. | 00001080 76 65 72 73 69 6f 6e 5f 72 00 2e 72 65 6c 61 2e | version_r..rela. | 00001090 64 79 6e 00 2e 72 65 6c 61 2e 70 6c 74 00 2e 69 | dyn..rela.plt..i | 000010a0 6e 69 74 00 2e 74 65 78 74 00 2e 66 69 6e 69 00 | nit..tekst. .fini. | 000010b0 2e 72 6f 64 61 74 61 00 2e 65 68 5f 66 72 61 6d | .rodata..eh_fram | 000010c0 65 5f 68 64 72 00 2e 65 68 5f 66 72 61 6d 65 00 | e_hdr..eh_frame . | 000010d0 2e 63 74 6f 72 73 00 2e 64 74 6f 72 73 00 2e 6a | .dktori..dtori..j | 000010e0 63 72 00 2e 64 79 6e 61 6d 69 63 00 2e 67 6f 74 | cr .. dinamički..got | 000010f0 00 2e 67 6f 74 2e 70 6c 74 00 2e 64 61 74 61 00 | ..got.plt..data. |
00001100 2e 62 73 73 00 00 00 00 00 00 00 00 00 00 00 00 | .bss ............ |  

Odlučio sam vidjeti što će dogoditi se ako sam zadnji dio ovog koda zamijenio null bajtovima. Program je i dalje radio u redu, ali to smanjuje prenosivost na druge operativne sustave.

Ako pokušate zamijeniti GNU drugim kompajlerom, recimo, clang , još uvijek radi u redu. Iako to može zbuniti inverznog inženjera, to sigurno nije tako teško primijetiti.

Napokon, pokušao sam vidjeti što će se dogoditi ako uklonim bilo kakav trag GLIBC...

  ./a.out: ./ a.out: nisu dostupne informacije o verziji (zahtijeva ./a.out)./a.out: greška pri preseljenju: ./a.out: simbol, verzija nije definirana u datoteci s referencom vremena veze  
"artefakti" ne uključuju samo žice. Čak i ako uklonite sve nizove, kôd ostaje i često može ukazivati ​​na upotrijebljeni prevodilac.
Iako su vam vlastita saznanja bila zanimljiva, Igor je u pravu. Ne radi se samo o stringovima, već i o dijelovima koda koje kompajler ubacuje u vašu konačnu binarnu datoteku. Trebali biste ga obrnuto inženjerirati i ići prema redefiniranju uputa po uputa dok potpuno ne uklonite sve karakteristike. Pokušajte stvoriti drugu verziju svog programa, ali umjesto puta () use, tj. Scanf (), primijetit ćete da imaju neke zajedničke karakteristike.
#4
+2
Remko
2013-03-23 14:58:18 UTC
view on stackexchange narkive permalink

Kratki odgovor: ne. Ne znam ni za jedan kompajler koji ima prekidač "stealth mode" i ako bi imao krajnji rezultat, IMO bi bio samo još jedan potpis za isti kompajler.

Kao što @ omghai2u predlaže da možete ručno izmijeniti binarni i testirati ga protiv automatiziranih alata, ali mislim da to neće puno pomoći.

Bolji pristup možda bi bio korištenje exe pakera / zaštitnika. Iako ga iskusni RE vjerojatno može raspakirati, to i dalje znači puno rada i znanja. Tako je barem prva crta obrane.

Dakle, on spakira svog exea, vi ga raspakirate i u mnogim vam slučajevima ostaju originalni artefakti kompajlera. Dodavanjem lažnih artefakata kompajlera, ako je učinjeno dovoljno i ispravno, trebalo bi onemogućiti utvrđivanje koji je kompajler stvarno korišten. Prva linija RE obrane je spakiranje, sigurno možda (osobno, ne slažem se); ali sigurno ne kako bi skrivao potpis kompajlera od analize.
#5
+1
jvoisin
2013-07-16 01:06:45 UTC
view on stackexchange narkive permalink

Možete pokušati:

  • Da biste uklonili neke tragove pomoću naredbe strip i sstrip .
  • Upotreba čudnih opcija kompilacije
  • Upotreba čudnih (poput tcc) ili starih kompajlera
  • Upotreba nekih pakiranja

Ali ne postoji srebrni metak. Možda biste se trebali zapitati o aspektu zašto svog pitanja umjesto o kako

Je li to `crtica` iz [ElfKickers] (https://github.com/BR903/ELFkickers) koju spominjete? (jer nisam pronašao paket za svoj Debian)
Da je. Ali, slobodno otvorite kartu kako biste ih uključili u Debian;)
Mogu ga sastaviti za sebe, nije potreban paket. ;-)


Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...