求助】反汇编问题!!!
http://bbs.pediy.com/showthread.php?t=61353
--------------------------------------------------------------------------------
将一个简单A+B程序反汇编了一下
程序如下
#include <stdio.h>
int main ()
{
int a,b;
a = 1;
b = 2;
a += b;
return 0;
}
反汇编程序如下;
我有以下疑问?请帮忙解决
:00401010 55 push ebp
:00401011 8BEC mov ebp, esp
:00401013 83EC48 sub esp, 00000048
;这里给局部变量留下存储空间,如何确定为48H?:
:00401016 53 push ebx
;作用是什么?
:00401017 56 push esi
:00401018 57 push edi
:00401019 8D7DB8 lea edi, dword ptr [ebp-48]
:0040101C B912000000 mov ecx, 00000012
;作用是什么貌似和A+B没有任何联系,为什么是00000012H?:
:00401021 B8CCCCCCCC mov eax, CCCCCCCC
;问题同上为什么是,后面用到EAX,应该ROX,EAX EAX 才对,清空EAX的值??
:00401026 F3 repz
:00401027 AB stosd
:00401028 C745FC01000000 mov [ebp-04], 00000001
:0040102F C745F802000000 mov [ebp-08], 00000002
:00401036 8B45FC mov eax, dword ptr [ebp-04]
:00401039 0345F8 add eax, dword ptr [ebp-08]
:0040103C 8945FC mov dword ptr [ebp-04], eax
:0040103F 33C0 xor eax, eax
:00401041 5F pop edi
:00401042 5E pop esi
:00401043 5B pop ebx
:00401044 8BE5 mov esp, ebp
:00401046 5D pop ebp
:00401047 C3 ret
///////////////////////////////////////////////////////////////////////////////////////
发现自己成长了!嘿嘿!
现在来回答自己以前提的问题:
:00401016 53 push ebx
;作用是什么?
:00401017 56 push esi
:00401018 57 push edi
1.为什么先要将ebx esi edi入栈 ,寄存器的使用惯例原因,约定eax,ecx,edx 由caller save, ebx esi edi由callee save!
保存他们的值后,在函数体内随便用了,退出前,把它们值pop回去!
2.:0040101C B912000000 mov ecx, 00000012
;作用是什么貌似和A+B没有任何联系,为什么是00000012H?:
:00401021 B8CCCCCCCC mov eax, CCCCCCCC
;问题同上为什么是,后面用到EAX,应该ROX,EAX EAX 才对,清空EAX的值??
:00401026 F3 repz
:00401027 AB stosd
这四句结合起来看!原来作用是把为保存局部变量那段空间,全部赋值为CC(INT 3),为什么是CC?安全考虑,在这段空间内放不是有效的字节码,跟shellcode有关,若出现一个
eip指向这里,那么程序只会执行INT 3
。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)