Exp1 PC平台逆向破解(5)M
实践内容
- 实践对象是一个可执行文件pwn1
- 本程序的正常执行顺序应该是main函数调用foo函数,foo函数输出用户输入的字符串。
本程序还包含了另一个代码片段getshell,会返回一个可用的shell值,在正常的执行状况中该段代码不会被执行,而我们此次实践的内容就是对可执行文件进行攻击,从而让程序执行到此段代码。
实践要求
2.1掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分)
2.2掌握反汇编与十六进制编程器 (0.5分)
2.3能正确修改机器指令改变程序执行流程(0.5分)
2.4能正确构造payload进行bof攻击(0.5分)
实践基础知识:
(1)NOP指令即“空指令”(机器码:90)。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。所以NOP指令自然也会占用执行一个指令的CPU时间片。
(2)JNE是一个条件转移指令(机器码:75)。当ZF=0,转至标号处执行。
(3)JE是一个条件转移指令(机器码:74)。如果相等则跳转。
(4)JMP是无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
(5)CMP为比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果(机器码:39)。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
实践过程
本次实践有三种实现方式
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
手工修改可执行文件
再动手之前应该知道反汇编指令是
objdump -d pwn1(文件名)|more
动手之前应该准备好32位的执行环境
64位Kali无法顺利执行pwn1问题的解决方案
开始实践
- 对pwn1进行备份并将副本命名为自己学号"20155329"并用副本进行实践。 使用cp 命令进行复制,例如cp pwn1 20155329
- 对可执行文件进行反汇编
objdump -d 20155329 | more
由反汇编结果可以看出
图一
- e8对应call命令
e8后的绿色部分为抵用的foo函数的偏移地址。
图二
- main地址是080484af、
- foo地址是08048491、
getshell的地址是0804847d。
综上所述
- foo函数的地址为08048291,getshellh函数的地址为0804847d,用16进制的减法我们可以精确的算出getshell比foo低了14,也就在原来的基础上减去14即可。而在linux环境下,采用小端存储的方式,也就是说d7为低位,就是说将到d7减去14即可,也就是变成c3。,我们使用vim编辑器对地址进行修改。
- 使用vim打开可执行文件20155329
- 此时文本为乱码,用“%!xxd”指令将文本转换成16进制文件来进行操作。
**修改偏移地址后,使用“%!xxd -r”将16进制文件转换成原文件保存退出。
运行可执行文件20155329
实验中遇见的问题
共享文件夹无法正常使用
重新安装 VMware tools
安装32位的运行库时出现问题
问题:无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?”- 解决办法:
- sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock