23.03.2013 Views

Quick introduction to reverse engineering for beginners

Quick introduction to reverse engineering for beginners

Quick introduction to reverse engineering for beginners

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

1.1 Hello, world!<br />

Let’s start with famous example from the book “The C programming Language” 1 :<br />

#include <br />

int main()<br />

{<br />

printf("hello, world");<br />

return 0;<br />

};<br />

Let’s compile it in MSVC 2010: cl 1.cpp /Fa1.asm<br />

(/Fa option mean generate assembly listing file)<br />

CONST SEGMENT<br />

$SG3830 DB ’hello, world’, 00H<br />

CONST ENDS<br />

PUBLIC _main<br />

EXTRN _printf:PROC<br />

; Function compile flags: /Odtp<br />

_TEXT SEGMENT<br />

_main PROC<br />

push ebp<br />

mov ebp, esp<br />

push OFFSET $SG3830<br />

call _printf<br />

add esp, 4<br />

xor eax, eax<br />

pop ebp<br />

ret 0<br />

_main ENDP<br />

_TEXT ENDS<br />

Compiler generated 1.obj file which will be linked in<strong>to</strong> 1.exe.<br />

In our case, the file contain two segments: CONST (<strong>for</strong> data constants) and _TEXT (<strong>for</strong> code).<br />

The string “hello, world” in C/C++ has type const char*, however hasn’t its own name.<br />

But compiler need <strong>to</strong> work with this string somehow, so it define internal name $SG3830 <strong>for</strong> it.<br />

As we can see, the string is terminated by zero byte — this is C/C++ standard of strings.<br />

In the code segment _TEXT there are only one function so far — _main.<br />

Function _main starting with prologue code and ending with epilogue code, like almost any function.<br />

Read more about it in section about function prolog and epilog 2.2.<br />

After function prologue we see a function printf() call: CALL _printf.<br />

Be<strong>for</strong>e the call, string address (or pointer <strong>to</strong> it) containing our greeting is placed in<strong>to</strong> stack with help of<br />

PUSH instruction.<br />

When printf() function returning control flow <strong>to</strong> main() function, string address (or pointer <strong>to</strong> it) is<br />

still in stack.<br />

Because we do not need it anymore, stack pointer (ESP register) is <strong>to</strong> be corrected.<br />

ADD ESP, 4 mean add 4 <strong>to</strong> the value in ESP register.<br />

Why 4? Since it is 32-bit code, we need exactly 4 bytes <strong>for</strong> address passing through the stack. It’s 8<br />

bytes in x64-code<br />

“ADD ESP, 4” is equivalent <strong>to</strong> “POP register” but without any register usage 2 .<br />

1 http://en.wikipedia.org/wiki/The_C_Programming_Language<br />

2 CPU flags, however, modified<br />

2

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!