您的位置:首页 > 其它

GDB调试汇编堆栈过程分析

2016-12-14 22:00 253 查看
GDB调试汇编堆栈过程分析

这时需要使用
sudo apt-get install libc6-dev-i386
命令安装一个库之后就可以产生汇编代码了。说是这么说,但是真的要弄好就,乌邦图源弄了好久。





disassemble
获取汇编代码,若命令不带参数,默认的反汇编范围是所选择帧的pc附近的函数。
info registers
列出使用的寄存器.




使用
x 0xffffd048
指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0。



display,设置程序中断后欲显示的数据及其格式。使用命令
display /i $pc
每次程序中断后可以看到即将被执行的下一条汇编指令,可以 其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。


si
执行一条汇编指令



%esp、%ebp(
info registers
)和堆栈内容的变化(
x/na %esp
)

一直使用以上三个指令,观察其变化

call将下一条指令的所在地址(即当时程序计数器PC的内容)入栈



将上一个函数的基址入栈,将当前%esp作为新基址。



准备传参



计算在%eax中进行



查看f函数的汇编代码



执行g函数,g初始化栈指针



g分配栈空间



计算short+in



pop %ebp指令将栈顶弹到%ebp中



ret返回g中call的调用位置



释放当前子程序在堆栈中的局部变量,恢复被函数修改的%ebp和%esp



主函数汇编代码


进入main函数, %esp加立即数4



将%edx于%eax相加



leave返回准备栈



ret结束main函数



指令%eip%esp%ebp%eax堆栈
push $0x80x804840b0xffffd0480xffffd0480xf7fb8dbc0x0
call 0x80483ef0x804840d0xffffd0440xffffd0480xf7fb8dbc0x8 0x0
push %ebp0x80483ef0xffffd0400xffffd0480xf7fb8dbc0x8048412 0x8 0x0
mov %esp,%ebp0x80483f00xffffd03c0xffffd0480xf7fb8dbc
mov 0x804a01c,%edx0x80483f20xffffd03c0xffffd03c0xf7fb8dbc0xffffd048 0x8048412 0x8 0x0
mov 0x8(%ebp),%eax0x80483f80xffffd03c0xffffd03c0xf7fb8dbc0xffffd048 0x8048412 0x8 0x0
call 0x80483db0x80483fe0xffffd0380xffffd03c0xa0xa 0xffffd048 0x8048412 0x8 0x0
push %ebp0x80483db0xffffd0340xffffd03c0xa0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
mov %esp,%ebp0x80483dc0xffffd0300xffffd03c0xa0xffffd03c 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
ret0x80483ee0xffffd0340xffffd03c0xb0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
leave0x80484060xffffd03c0xffffd03c0xb0xffffd048 0x8048412 0x8 0x0
ret0x80484070xffffd0400xffffd0480xb0x8048412 0x8 0x0
add $0x4,%esp0x80484070xffffd0400xffffd0480xb0x8 0x0
leave0x804841c0xffffd0480xffffd0480xe
ret0x804841d0xffffd04c0x00xe
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: