反汇编测试
反汇编测试
1. 编译汇编代码
-
代码:

-
汇编代码编译
输入gcc -S -o main.s main.c将下面c程序”week0303学号.c“编译成汇编代码

2. 使用gdb跟踪汇编代码
-
使用
gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编

-
产生上图所示的报错,因为Ubuntu是64位的
解决方法:执行命令:sudo apt-get install gcc-multilib g++-multilib modoule-assistant安装相应文件即可解决。

-
使用
gdb example指令进入gdb调试器:

-
进入后,先在main函数处设置一个断点,run一下。

-
使用
disassemble指令获取汇编代码。

-
用
info registers指令查看各寄存器的值

-
可见此时主函数的栈基址为0xffffd0cc,用
x(examine)指令查看内存地址中的值

-
执行命令
display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句

-
执行命令
si打印下一条要执行的语句,i r查看寄存器值,x/na查看栈的情况
















-
eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况:
| 指令 | eip(rip) | ebp(rbp) | esp(rsb) | eax(rax) | 堆栈 |
|---|---|---|---|---|---|
| push | 0x565561f3 | 0x0 | 0xffffd0cc | 0xf7fb5808 | 0xf7deaee5 |
| mov | 0x565561f7 | 0x0 | 0xffffd0cc | 0xf7fb5808 | 0xf7deaee5 0x1 |
| call | 0x565561f8 | 0x0 | 0xffffd0c8 | 0xf7fb5808 | 0x0 0xf7deaee5 0x1 |
| mov | 0x565561fa | 0xffffd0c8 | 0xffffd0c8 | 0xf7fb5808 | 0x0 0xf7deaee5 0x1 0xffffd164 |
| ret | 0x56556213 | 0xffffd0c8 | 0xffffd0c4 | 0xf7fb5808 | 0x565561ff 0x0 0xf7deaee5 0x1 |
| add | 0x56556216 | 0xffffd0c8 | 0xffffd0c4 | 0x565561ff | 0x565561ff 0x0 0xf7deaee5 0x1 |
| push | 0x565561ff | 0xffffd0c8 | 0xffffd0c8 | 0x565561ff | 0x0 0xf7deaee5 0x1 0xffffd164 |
| call | 0x56556204 | 0xffffd0c8 | 0xffffd0c8 | 0x56558fdc | 0x8 0x0 0xf7deaee5 0x1 |

浙公网安备 33010602011771号