反汇编测试
反汇编测试
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 |