IDA Pro dan teknik reverse engineering

0x00 mulai


; {EN} entry point, do nothing, just run _main {EN}


Artikel untuk pemula "pejuang kegelapan", mereka yang ingin terjun ke sisi gelap kekuasaan: rekayasa terbalik. Di "meja operasi" kami akan ada server artisanal kecil yang berjalan di atas TCP / IP. Untuk menganalisis protokol pertukaran data, kami akan dibantu oleh standar de facto di bidang reverse - IDA Pro.


Banyak artikel telah ditulis tentang reverse engineering dan IDA Pro (walaupun tidak sebanyak PHP), tetapi karena proses sebaliknya adalah penelitian, gagasan tentang bagaimana mendekati tugas pengembangan terbalik dari "sisi lain" berguna untuk pemula. Paling tidak, sebagai seorang penulis, saya dibimbing oleh gagasan untuk menguraikan praktik-praktik dasar dan teknik-teknik yang saya bicarakan pada hari-hari awal kepada semua pekerja magang dan pada beberapa pasangan pertama dari kursus rekayasa terbalik di universitas.


Apa yang tidak ada dalam artikel?

Google Chrome Apple iPhone… CVE , , - .



"Begitu kamu mulai menyusuri jalan yang gelap, selamanya akan mendominasi takdirmu."


Subjek: crackme - jangan menjalankan binari pada sistem utama, lebih baik melakukannya di mesin virtual!


Persyaratan sistem: mesin virtual dengan Windows 7 / 0xA diinstal


0x01 mov eax, ds: __ stack_chk_guard


; {EN} Disclaimer {EN}


, , x86, , (), .. . , .



0x10 , ?


; {EN} Setups prerequisites for the consequent execution {EN}


, , :


  • C C++;
  • x86;
  • (PE, ELF);
  • , β€” ;
  • ;
  • ;
  • .

, β€” IDA Pro Hex-Rays ( , β€œ ” β€œβ€, , β€œ ”, ). , -, , : ( IDA β€” ) x86.


, β€” . ( , *.exe Windows), , . , , x86 ( x64 β€” ).


β€” , x86 (assembler language).



, x86: (mov, lea, push/pop, call, jmp, ), . , , :



, . 10 , . ().


. , , , regexp ( ) β€” , . , .


β€” 30 (, , 30 ) .


0x20 IDA Pro ?


; {EN} Whatta hell? {EN}



- ( ) β€” β€œ , - … , - β€” ( ), , , , - ” β€” Reversing: Secrets of Reverse Engineering, Eldad Eilam.

? , . , IDA? IDA β€” , β€œ β€œ. β€œβ€. , , -, , , β€œ ”, . IDE β€” , , β€” .. β€” . IDA Pro , .


, , . - , β€” radare2 ( r2, Cutter , IDA Pro). , IDA Pro Python API .


-, , , 100% . , - , IDA Pro! .



0x30 IDA Pro


; {EN}
; This function is too complex.
; Perhaps it interacts with user.
; But currently I am not sure about it.
; A lot of calls to Qt-framework.
; {EN}

0x31 IDA Pro


IDA Pro. ( ), . , , β€” . β€œβ€.



IDA Pro


( exe- IDA, ) , IDA Pro (PE, portable execute), , , , .


- , , . , -, , , .


, . β€” , .


, β€œβ€ ( - ). . , .


, (. ). β€œβ€ , - .




0x32 IDA Pro ?


IDA Pro : , , β€” , . IDA Pro ( ). IDA Pro ( Python C++). IDA Meta PC β€” x86/x64, , Intel AMD. , , IDA, Portable Executable. , , , ( ). , ( loader- IDA, «» , IDA ).


, :


  • (analyze);
  • (emulate β€” , , , QEMU);
  • .

β€œβ€ IDA , β€œβ€ . , ( ), IDA .


, , . , , , IDA.


, IDA Pro . β€œβ€ (, , ). IDA (, MongoDB) . .idb ( .i64).


, , , . , , . AU: Idle IDA Pro.


UX/UI IDA Pro

GUI IDA Pro Qt, , - , Qt, :


  • drag&drop ;
  • , . , .


main


, IDA Pro.


  • β€” ( , - ). , . . ( β€” , β€” ). , .

Proximity View

, Proximity View. .


. , , .


  • β€” , , . , ( ). ( gcc -s) -g, , . IDA Pro sub_<_ _>;
  • (Strings) β€” , , SHIFT+F12. IDA Pro β€” , . , .

0x33 β€œβ€ IDA Pro


- , . ? , IDA Pro? β€” . - , .



IDA Pro (-, cheatsheet) . -. - IDA Pro β€” Hexrays. - , , , , , - .



CTRL+S CTRL+Z?

, . β€” (CTRL+W, ), β€” undo. , undo β€” . - , CTRL+Z. , undo 7.3 ( β€” 7.0), undo β€” . , - IDA, , . , (make code) .


, , IDA Pro. , - " ", . , IDA Pro .


IDA Pro.


0x33a


β€” , , IDA Pro, :


  • ;
  • , ESC CTRL+ENTER ( - β€” );
  • β€” SPACE, ();
  • : ( ) X. , ( );
  • (g): ( 0x) IDA Pro β€” (), .

0x33b


() :


  • ( N): , ( ), . , , .
  • . : , , ;.

0x33c (data representation)


:


  • (byte);
  • (word);
  • (dword);
  • (offset);
  • (undefined);
  • (code).

, , β€” , (, ..). , ( ), IDA Pro undefined. , , . , ( ), , IDA Pro.


0x33d


:


  • ( IDA Pro );
  • ( , P).
    IDA Pro , . ? , (call), , , , β€” .

,

- , IDA Pro , , IDA Pro . , call, , "" call . , - , , , β€” .


0x33e


, . , mov eax, 0xFFFFFFFF , , mov eax, -1. , , , IDA Pro .


0x33f IDA Pro


Strings, Names, Functions, Hex Dump. View->Open Subviews.


0x40 ?


; {EN}
; I think I found actual protocol parsing in function sub_401D3C
;
; But this function just chases bytes from corner to corner
; before actual parsing... we need to go deeper
; {EN}

0x41 ?


, " " IDA Pro, , .


, , IDA 76 , . , , . «» 100% ( ). :


  • . , ;
  • , , , API;
  • (, );
  • - ...

, , , β€” . , , . , , .


0x42


; {RU}
;     ;
;    ;
;   ,     ( .1-3);
; {RU}

? , , API OpenSource-, "doxygen": API .


doxygen?

doxygen β€” . , , . , , , β€” HTML ( ).


, TCP/IP-, , β€œβ€ recv, . , recvfrom, API β€” ( Linux β€” read).


: / , Socket programming in c using TCP/IP.



IDA Pro? ( , ). SHIFT+F4. (Names).


, ( , ). , , , , CTRL+F. ( ). , ( recv), , , ( ).


. ( ENTER).


: ESC.




. recv (, recv β€” , ).


, recv. IDA Pro ( ) . , , ( ), , X. , . . type :


  • p[rocedure] β€” β€œ ”, () call;
  • r[ead] β€” ; ();
  • w[rite] β€” ; ().

:


  1. recv ( r),
  2. recv ( p).
    , recv . :

push    0
push    1000h   ; len
push    ebx     ; buf
push    edi     ; s
call    esi     ; recv   <----   recv 

, call esi. IDA , esi, , call esi recv. IDA recv .



recv


p, IDA ( ), recv. β€” IDA. , recv: sub_401D3C.


? . . , , recv , - , ( β€” ).


0x43 β€œ ”: sub_401D3C


; {EN} x_vserv_protocol {EN}


x_?

x_ ( eXecutable), IDA Pro.
ax_ β€” (IDAPython);
v_ β€” ( Variable);
av_ β€” , (IDAPython).


sub_401D3C recv . , «».


: : . , ( ), β€” .


(. Β«debugΒ» β€” ) , . , -, : -- . -, - , ,


, , , , , . , , , , , , , .



recv


β€œ ”. sub_401D3C, , : sub_401CF0 sub_401BFD. , puts β€” libc. (stdout). - , , , - !



: recv. β€œ ” . Strings (SHIFT+F12) , , - -. , .


, , puts. 0x00401D64 ( , g ) β€œReceived failed", 0x00401D7A β€” "Client disconnected", 0x00401D9C β€” β€œVSERV protocol error…”. , VSERV ( ). :


  • 0x00401D76 RECV_SUCCESS;
  • 0x00401D8C CLIENT_NOT_DISCONNECTED.

: -. , , β€” . , , , , , - . . : β€œ ”, , .



, 0x00401D54 β€” , β€œβ€ . β€œRECV_LOOP”. IDA Pro : ( ) ( ) .


0x00401D3C, , , , x_vserv_protocol. , , β€” , ( TCP β€œβ€). , x_vserv_protocol, , sub_401CF0 sub_401BFD, ( ESC).




0x44 β€œ ”: sub_401CF0


; {EN} x_vserv_parse_header {EN}

, , sub_401CF0, . , , sub_401CF0. . ( ), , :


  • (, , recv TCP-);
  • (if-else);
  • memcmp atoi;
  • 0xFFFFFFFF (-1) ;
  • .


_ sub_401CF0 x_vserv_parse_header_


, .


0x44a sub_401CF0


IDA ( , , calling convention ( ) , ). , ( x86 cdecl, , ), IDA Pro arg_.


: (calling convention). , ( , ). , , β€” x86- ( push), eax (, return).


. packet_buffer? , , , . x_vserv_protocol. ebx. ebx , IDA , . recv (, ) (, Β« Β»).



_ x_vserv_parse_header_


( , recv) recv. , β€” , recv . , , sub_401CF0 TCP- .


0x44b sub_401CF0


, IDA Pro , ( ). sub_401CF0 , sub_401CF0 .


, , IDA Pro , if-else . :


  • β€” , ;
  • β€” .

, , . sub_401CF0 , , .


: if-else ( ):


  1. ( );
  2. .

0x44c sub_401CF0 memcmp atoi


, , , . API- , , , , memcmp.


: β€œfear … leads to suffering”, -, , , , reboot. , , , . . reboot, : Β«or enables/disables the reboot keystrokeΒ». «» F8, reboot, , , … RTFM!


, memcmp , «» . , , . , 0 β€” , 1 β€” . 0, , > 0, < 0.


API- atoi , ascii-, integer. , , β€” .


0x44d


API- ?


-, memcmp ( , «», ). , memcmp ( ), "VMES" 4 ( VMES). , , , eax 0xFFFFFFFF (-1), atoi.


memcmp, strcmp, , - , , 4 . strcmp -. "VMES" - , , β€” - . - , , strcmp .


-, atoi, , - ( ). , atoi β€” VMES ( , 0x00401D19) β€” . atoi eax. , eax , , -1. , x86 eax, , β€” -1, . , ? , :


char tmp[5] = { 0 };
if (memcmp(&buf[0], "VMES", 4) != 0)
    return -1;
*(int*) tmp = *(int*)(&buf[4]);
return atoi(tmp);

. , : 5 ? ? atoi(buf + 4)? atoi, strtol ( atoi, strtol 10). , , , . , 10- 0 9. , , , , - . ( ) . : - ascii-.


5 , ( ): buffer_length var_D ( ). 0 , . var_D -.


x_vserv_parse_header ( ).


0x45 β€œ ”: sub_401BFD


; {EN} x_vserv_parse_body {EN}

0x45a


, , «» , . , . x_vserv_protocol, PARSE_BODY ( , , g, ENTER). push, , , sub_401BFD ( x_vserv_protocol_body). , .



_ body_buffer?_


( lea) ( body_buffer). β€” , x_vserv_protocol_header ( eax push ). β€” atoi-, .


, body_buffer, :


  • , recv;
  • x_vserv_protocol.

, recv, . recv , , ebx recv (. RECV_LOOP). ebx , , , esp. esp ( ) , , , push/pop. esp , :


char buffer[0x1000];


: ? , , , , . , , . Wikipedia.


( ) x_vserv_protocol. IDA Pro , ( β€” «» ). , .




, recv ( esp ). ( β€” N) vmes_sign ( "VMES").


β€” , atoi x_vserv_parse_header. , x_vserv_parse_header ( 0x00401D19). mov [ebx+4] eax atoi. , , vmes_body_len.


, TCP-. - , , β€” , (), , , x_vserv_parse_header. , x_vserv_parse_body.


0x45b


( ESC) . sub_401BFD (x_vserv_protocol_body β€” ) β€” , , TCP- recv, ( , β€” ). – , +4 (, ) «» atoi, .


: - Stack BOF ( Stack Buffer Overflow, ) , . , . , .


x_vserv_protocol_body, .



_ x_vserv_protocol_body_


- «» , if-else-if-else-if-else (, switch). , , , β€œHEXDUMP”, β€œTALK2ME”, β€œB64DECO”, β€œDISCONN”, β€œSTOP!!!”. , Β«Unknown commandΒ». , , β€” . . : x_vserv_hexdump, x_vserv_talk2me, x_vserv_b64deco, x_vserv_disconn, x_vserv_stop. .


0x45c vserv


, , , , . , , , 15 ( ). - , , len, , , x_vserv_hexdump. .



_ x_vserv_hexdump_


, , ebp (, , ebp ). , , , , , .


0x45d



0x50 Is this the end?


; {EN} x_vserv_parse_body {EN}

, -, . , , , , IDA Pro.


9- -, VSERV IDA Pro, RCE ( ) .



All Articles