这是C代码:
void test_function(int a, int b, int c, int d)
{
int flag;
char buffer[10];
flag = 31337;
buffer[0] = 'A';
}
int main()
{
test_function(1, 2, 3, 4);
}
test_function的组装:
Dump of assembler code for function test_function:
0x08048344 <test_function+0>: push ebp
0x08048345 <test_function+1>: mov ebp,esp
0x08048347 <test_function+3>: sub esp,0x28
0x0804834a <test_function+6>: mov DWORD PTR [ebp-12],0x7a69
0x08048351 <test_function+13>: mov BYTE PTR [ebp-40],0x41
0x08048355 <test_function+17>: leave
0x08048356 <test_function+18>: ret
End of assembler dump.
(gdb) print $ebp-12
$1 = (void *) 0xbffff7dc
(gdb) print $ebp-40
$2 = (void *) 0xbffff7c0
(gdb) x/16xw $esp
0xbffff7c0: (1)0x00000000 0x08049548 0xbffff7d8 0x08048249
0xbffff7d0: 0xb7f9f729 0xb7fd6ff4 0xbffff808 0x080483b9
0xbffff7e0: 0xb7fd6ff4 (2)0xbffff89c (3)0xbffff808 (4)0x0804838b
0xbffff7f0: (5)0x00000001 0x00000002 0x00000003 0x00000004
我对这些主题不熟悉;因此,我的脑海中有一些疑问。
1.我想汇编代码的前三行是序言。它推送ebp,然后将esp复制到ebt。然而,我不明白为什么esp在内存中返回40个字节。
1.它把31337放进ebp-12,但为什么它就是ebp-12,它代表了国旗的记忆?似乎没有,因为在底部,(2)被指定为标志的存储器。
1.在“x/16 xw $esp”下面,左边不包括任何(数字)的其他内存是什么,因为有数字的内存代表局部变量,参数和sfp?
1条答案
按热度按时间7vhp5slm1#
你的问题
ebt是错误的,没有寄存器调用ebt。应该是EBP。
该命令用于在调用test_function函数之前保留堆栈底部。
该命令用于增加堆栈以分配新的存储器块,用于在test_function函数的执行期间存储值。堆栈增加的大小不是固定的,不会总是0x 28。此值由编译器计算,以确保大小合适。
对应于标志= 31337,标志地址等于ebp-12的值。地址由编译器分配。DWORD对应于int。十六进制数0x 7a 69相当于十进制数31337。
然后呢
和…一样。十六进制数0x 41相当于十进制数65。字母A的ASCII码的十进制值是十进制数65。BYTE对应于char。
低于代码
例如0xbffff 7 c 0:左边代码的值是地址,它的值是0x 0000000。所以0xbffff 7 c4(0xbffff 7 c4 = 0xbffff 7 c 0 + 4)地址的值是0x 08049548,因为0x 00000000占用4个字节。0xbffff 7 c8地址的值是0xbffff 7 d8。....
我认为下面的汇编代码
可以转换下面的代码(如@Peter Cordes指出“leave”等于“mov esp,ebp”+“pop ebp”见https://www.felixcloutier.com/x86/leave)
所以我们可以得到一个图片见下文: