第五周实验楼反汇编实验
实验步骤
-
使用基于64位Linux版本32位编译调试指令:
sudo apt-get install libc6-dev-i386
-
生成汇编代码:
gcc -g code.c -o code -m32
-
进入gdb调试器:
gdb code
-
在main函数处断点设置:
b main
-
开始gdb调试:
run
-
使用
disassemble
指令获取汇编代码,用i(info) r(registers)
指令查看各寄存器的值- 第1列:寄存器名称
- 第2列:寄存器的地址
- 第3列:寄存器中存的值
-
使用
display /i $pc
命令查看当前执行的汇编代码
- 使用
print /x $ebp(esp)
命令查看相应寄存器的值
- 使用
si
命令执行下一步
寄存器分析
指令 | %ebp | %esp | 堆栈 |
push $0xf | 0xffffcff8 | 0xffffcff8 | 0x0 |
call 0x80483e6 | 0xffffcff8 | 0xffffcff4 | 0xf 0x0 |
push %ebp | 0xffffcff8 | 0xffffcff0 | 0x8048400 0xf 0x0 |
mov %esp,%ebp | 0xffffcff8 | 0xffffcfec | 0xfffff048 0x8048400 0xf 0x0 |
pushl 0x8(%ebp) | 0xffffcfec | 0xffffcfec | 0xfffff048 0x8048400 0xf 0x0 |
call 0x80483db | 0xffffcfec | 0xffffcfe8 | 0xf 0xfffff048 0x8048400 0xf 0x0 |
push %ebp | 0xffffcfec | 0xffffcfe4 | 0x80483f1 0xf 0xfffff048 0x8048400 0xf 0x0 |
mov %esp,%ebp | 0xffffcfec | 0xffffcfe0 | 0xfffff03c 0x80483f1 0xf 0xfffff048 0x8048400 0xf 0x0 |
mov 0x8(%ebp),%eax | 0xffffcfe0 | 0xffffcfe0 | 0xfffff03c 0x80483f1 0xf 0xfffff048 0x8048400 0xf 0x0 |
ret | 0xffffcfec | 0xffffcfe4 | 0x80483f1 0xf 0xfffff048 0x8048400 0xf 0x0 |
leave | 0xffffcfec | 0xffffcfec | 0xfffff048 0x8048400 0xf 0x0 |
ret | 0xffffcff8 | 0xffffcff0 | 0x8048400 0xf 0x0 |
add $0x4,%esp | 0xffffcff8 | 0xffffcff4 | 0xf 0x0 |
add $0x3,%eax | 0xffffcff8 | 0xffffcff8 | 0x0 |
ret | 0x0 | 0xffffcffc |
实验中遇到的问题和解决方法
问题:
解决方法:
通过上网百度和请教老师,我尝试拷贝其他同学的sources.list
文件(如上图所示)到自己的虚拟机中,然后更新,再次输入sudo apt-get install libc6-dev-i386
命令,终于解决了问题。