- IDE反汇编函数调用实验
第一题
题目
请在XP VC6下调试课本的示例程序并将call语句执行过程中的EIP变化、ESP、EBP变化等状态进行记录,解释变化的主要原因
解答
int add(int x, int y) |
(加粗表示寄存器数据发生变化,表格中数据表示该行指令执行前的数据)
汇编步骤 | EIP | ESP | EBP |
---|---|---|---|
11: n = add(1, 3); | |||
0040108F push 3 | |||
00401091 push 1 | |||
00401093 call @ILT+0(add) (00401005) | 00401093 | 0012FF28 | 0012FF80 |
00401098 add esp,8 | 00401098 | 0012FF28 | 0012FF80 |
0040109B mov dword ptr [ebp-4],eax | |||
00401005 jmp add(00401030) | 00401005 | 0012FF24 | 0012FF80 |
2: int add(int x, int y) | |||
3: { | (省略未变化部分) | ||
00401030 push ebp | 00401030 | 0012FF24 | 0012FF80 |
00401031 mov ebp,esp | 00401031 | 0012FF20 | |
00401033 sub esp,44h | 00401033 | 0012FF20 | |
00401036 push ebx | 00401036 | 0012FEDC | |
00401037 push esi | 00401037 | 0012FED8 | |
00401038 push edi | 00401038 | 0012FED4 | |
00401039 lea edi,[ebp-44h] | 00401039 | 0012FED0 | |
0040103C mov ecx,11h | 0040103C | ||
00401041 mov eax,0CCCCCCCCh | 00401041 | ||
00401046 rep stos dword ptr [edi] | 00401046 | ||
4: int z = 0; | |||
00401048 mov dword ptr [ebp-4],0 | 00401048 | ||
5: z = x + y; | |||
0040104F mov eax,dword ptr [ebp+8] | 0040104F | ||
00401052 add eax,dword ptr [ebp+0Ch] | 00401052 | ||
00401055 mov dword ptr [ebp-4],eax | 00401055 | ||
6: return z; | |||
00401058 mov eax,dword ptr [ebp-4] | 00401058 | ||
7: } | |||
0040105B pop edi | 0040105B | ||
0040105C pop esi | 0040105C | 0012FED4 | |
0040105D pop ebx | 0040105D | 0012FED8 | |
0040105E mov esp,ebp | 0040105E | 0012FEDC | |
00401060 pop ebp | 00401060 | 0012FF20 | |
00401061 ret | 00401061 | 0012FF24 | 0012FF80 |
寄存器变化原因
EIP:
- 指向下一步要进行的指令位置,随汇编代码执行过程改变
ESP:
- PUSH,POP操作导致栈顶变化
- 函数调用过程中的栈帧变化
- 直接对ESP的值进行修改
EBP:
函数调用过程中的栈帧变化
调用函数 mov ebp,esp
函数返回 pop ebp
第二题
题目
相同的程序,请在非XP的当前windows操作系统的vs2003以上版本中运行,绘制add函数执行时的栈状态,并与XP下同时刻的状态进行比较
解答
- 与xp系统下的vc6栈状态不同:
- vc6栈帧预留空间为044h
sub esp,044h
- vs2019为0CCh
sub esp,0CCh
- vc6栈帧预留空间为044h
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.