IDA Pro e técnicas de engenharia reversa

0x00 start


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


Um artigo para iniciantes "guerreiros das trevas", aqueles que querem mergulhar no lado sombrio do poder: engenharia reversa. Na nossa "mesa operacional", haverá um pequeno servidor artesanal executado em TCP / IP. Para analisar o protocolo de troca de dados, seremos ajudados pelo padrão de fato no campo do reverso - IDA Pro.


Muitos artigos já foram escritos sobre engenharia reversa e no IDA Pro (embora não tanto quanto sobre PHP), mas como o processo reverso é de pesquisa, a idéia de como abordar a tarefa de desenvolvimento reverso do “outro lado” é útil para iniciantes. Pelo menos, como autor, fui guiado pela idéia de expor as práticas e técnicas básicas de que falo nos primeiros dias a todos os estagiários e nos primeiros pares do curso de engenharia reversa da universidade.


O que não estará no artigo?

Google Chrome Apple iPhone… CVE , , - .



"Depois de começar o caminho sombrio, para sempre ele dominará seu destino."


Assunto: crackme - não execute binários no sistema principal, é melhor fazer isso em uma máquina virtual!


Requisitos de sistema: máquina virtual com Windows 7 / 0xA instalado


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