https://blogs.msdn.microsoft.com/ntdebugging/2008/11/13/debug-fundamentals-exercise-1-reverse-engineer-a-function/




코드, 레지스터, 스택 값을 보고 아래 질문에 답해보세요.


1. DoTheWork 함수가 리턴될 때, 함수의 리턴값은?`

2. 보너스 문제: DoTheWork가 수행하는 함수의 연산자는?


힌트


1. 어셈블리어에서 괄호[] 는 괄호 안의 값을 메모리 주소로 취급하고, 해당 주소에 있는 값을 엑세스 한다는 의미임.

2. 32비트 integer 리턴값은 eax에 들어감.



// Code

0:000> uf eip


demo2!DoTheWork:

0040101c 55              push    ebp


0040101d 8bec            mov     ebp,esp


0040101f 8b4d08          mov     ecx,dword ptr [ebp+8]


00401022 8bc1            mov     eax,ecx


00401024 49              dec     ecx


00401025 0fafc1          imul    eax,ecx


00401028 83f902          cmp     ecx,2


0040102b 7ff7            jg      demo2!DoTheWork+0x8 (00401024)


0040102d 5d              pop     ebp


0040102e c3              ret



// Current register state

0:000> r

eax=00000007 ebx=7ffd9000 ecx=ffffffff edx=00000007 esi=00001771 edi=00000000

eip=0040101c esp=0012fe9c ebp=0012feac iopl=0         nv up ei pl nz na po nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202


demo2!DoTheWork:

0040101c 55              push    ebp



// Current stack values for this thread


0:000> dps esp


0012fe9c  00406717 demo2!main+0x27

0012fea0  00000007

0012fea4  82059a87

0012fea8  00000007

0012feac  0012ff88

0012feb0  004012b2 demo2!mainCRTStartup+0x170

0012feb4  00000002

0012feb8  00980e48

0012febc  00980e80

0012fec0  00000094

0012fec4  00000006

0012fec8  00000000

0012fecc  00001771

0012fed0  00000002

0012fed4  76726553

0012fed8  20656369

0012fedc  6b636150

0012fee0  00003120

0012fee4  00000000

0012fee8  00000000

0012feec  00000000

0012fef0  00000000

0012fef4  00000000

0012fef8  00000000

0012fefc  00000000

0012ff00  00000000

0012ff04  00000000

0012ff08  00000000

0012ff0c  00000000

0012ff10  00000000

0012ff14  00000000

0012ff18  00000000




아 캐피탈리즘 보고 있는데 리버싱할때마다 개노가다라는 생각 밖에 안듬. ㅠ.ㅠ


스택이랑 레지스터 값을 볼땐 eip를 꼭 확인해야 햇갈리지 않습니당... 특히 함수 콜 과정에서 esp, ebp 값이 변하기 때문에 함수 인자를 잘못 읽을 수도 있음.