0x00开始
; {EN} entry point, do nothing, just run _main {EN}
针对“黑暗勇士”的初学者的文章,那些想跳入权力黑暗面的人:逆向工程。在我们的“手术台”上,将有一个通过TCP / IP运行的小型手工服务器。为了分析数据交换协议,我们将使用反向领域的事实上的标准-IDA Pro来帮助我们。
已经有很多关于逆向工程和IDA Pro的文章(尽管在PHP上不多),但是由于逆向过程是研究工作,因此如何从``另一端''着手进行逆向开发任务的想法对于初学者很有用。至少作为作者,我受到这样一种思想的指导:将我早年向所有实习生以及大学逆向工程课程的前几对讲到的基本实践和技术加以阐述。
文章中将没有什么内容?Google Chrome Apple iPhone… CVE , , - .

“一旦你走上了黑暗的道路,它将永远统治你的命运。”
主题:的crackme - 不运行主系统上的二进制文件,这是更好地做到这一点在虚拟机上!
系统要求:安装了Windows 7 / 0xA的虚拟机
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 ProGUI IDA Pro Qt, , - , Qt, :

main
, IDA Pro.
- — ( , - ). , . . ( — , — ). , .
. , , .
- — , , . , ( ). ( 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] — ; ().
:
- recv ( r),
- 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 ( ):
- ( );
- .
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, . 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 ( ) .
