您的位置:首页 > 其它

GDB调试汇编堆栈过程分析

2016-12-04 17:11 218 查看
源代码:



使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器,在main函数设置断点,run一下:



使用disassemble指令获取汇编代码:



用i(info) r(registers)指令查看各寄存器的值, 此时主函数的栈基址为0xbffff344,用x(examine)指令查看内存地址中的值



设置:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。用x(examine)指令查看内存地址中的值



call指令将下一条指令的地址入栈:



将上一个函数的基址入栈,从当前%esp开始作为新基址:



为传参做准备:





实参计算在%eax中进行:



f函数汇编代码:



传参:



实参入栈:



call指令将下一条指令的地址入栈:







计算short+int:









pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:





ret指令将栈顶弹给%eip:



因为函数f修改了%esp,所以用leave指令恢复。leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp:







leave指令恢复





指令%eip%esp%ebp%eax
movl $0x8,(%esp)0x80483e20xbffff3440xbffff3480x1
call 0x80483c40x80483e90xbffff3440xbffff3480x1
push %ebp0x80483c40xbffff3400xbffff3480x1
mov %esp,%ebp0x80483c50xbffff33c0xbffff3480x1
sub $0x4,%esp0x80483c70xbffff33c0xbffff33c0x1
mov 0x804a014,%eax0x80483ca0xbffff3380xbffff33c0x1
add $0x8(%ebp),%eax0x80483c50xbffff33c0xbffff3480x2
mov %eax,(%esp)0x80483d20xbffff3380xbffff33c0xa
call 0x80483b40x80483d50xbffff3380xbffff33c0xa
push %ebp0x80483b40xbffff3340xbffff33c0xa
mov %esp,%ebp0x80483b50xbffff3300xbffff33c0xa
movzwl 0x804a010,%eax0x80483b70xbffff3300xbffff3300xa
cwtl0x80483be0xbffff3300xbffff3300x1
add 0x8(%ebx),%eax0x80483bf0xbffff3300xbffff3300x1
pop %ebx0x80483c20xbffff3300xbffff3300xb
ret0x80483c30xbffff3340xbffff33c0xb
leave0x80483da0xbffff3380xbffff33c0xb
ret0x80483db0xbffff3400xbffff3480xb
mov 0x80484d0,%edx0x80483ee0xbffff3440xbffff3480xb
add %edx,%eax0x80483f40xbffff3440xbffff3480xb
leave0x80483f60xbffff3440xbffff3480xe
ret0x80483f70xbffff34c0x00xe
指令栈帧
movl $0x8,(%esp)0x0
call 0x80483c40x8 0x0
push %ebp0x80483ee 0x8 0x0
mov %esp,%ebp0xbffff348 0x80483ee 0x8 0x0
sub $0x4,%esp0xbffff348 0x80483ee 0x8 0x0
mov 0x804a014,%eax0xbffff348 0x80483ee 0x8 0x0
add $0x8(%ebp),%eax0xbffff348 0x80483ee 0x8 0x0
mov %eax,(%esp)0xbffff348 0x80483ee 0x8 0x0
call 0x80483b40xa 0xbffff348 0x80483ee 0x8 0x0
push %ebp0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
mov %esp,%ebp0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
movzwl 0x804a010,%eax0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
cwtl0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
add 0x8(%ebx),%eax0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
pop %ebx0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
ret0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
leave0xa 0xbffff348 0x80483ee 0x8 0x0
ret0xa 0x80483ee 0x8 0x0
mov 0x80484d0,%edx0x8 0x0
add %edx,%eax0x8 0x0
leave0x8 0x0
ret
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: