首页
社区
课程
招聘
[旧帖] [求助]反汇编问题!!! 0.00雪花
发表于: 2008-3-16 19:38 4053

[旧帖] [求助]反汇编问题!!! 0.00雪花

2008-3-16 19:38
4053
将一个简单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

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
: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]
你的程序的代码是这一段.上面的是没关系的\可能是编译器生成的.\
2008-3-16 19:51
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
3
: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

这似乎是在为申请的局部变量写入初始化值,估计和编译器有关。为什么是12是因为上面的48。
至于为什么是48我也搞不懂。

ebx,esi,edi是每个函数都要保存的三个寄存器(当然自己写个函数就是不保存他们也没人说错)。
2008-3-16 20:24
0
雪    币: 297
活跃值: (27)
能力值: ( LV13,RANK:380 )
在线值:
发帖
回帖
粉丝
4
这是VC编译器的魔术,具体来说就是cl.exe。
当你在选项中使用了堆栈检查选项时,如/GZ, /RTCs, /RTC1时,在函数开头就会将所有堆栈变量赋值CCCCCCCC,你已经看到是在对变量初始化之前。
我不清楚你的程序为什么会多出了0x40的空间,也许你VS IDE的默认编译选项Options或makefile会告诉你我答案。
Enjoy it.
2008-3-16 22:37
0
游客
登录 | 注册 方可回帖
返回
//