2019-2020-2 20175227张雪莹《网络对抗技术》
Exp1 PC平台逆向破解
目录
0. 实验目标
1. 实验内容
2. 实验要求
3. 老师提问
4. 所遇到的问题及其解决方法
- 五、实验感想
六、参考资料
0. 实验目标
- 本次实践的对象是一个名为pwn1(为了区别于其他同学以改名为“
pwn1_20175227
”)的linux可执行文件。 - 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
- 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下个代码是不会被运行的。
- 我们实践的目标就是想办法运行这个代码片段。
我们将学两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
1. 实验内容
1.1 直接修改程序机器指令,改变程序执行流程
- 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
- 学习目标:理解可执行文件与机器指令
- 进阶:掌握ELF文件格式,掌握动态技术
- 步骤:
下载目标文件
pwn1
,用objdump -d pwn1 | more
反汇编并分页显示。
- 输入
/main
,查找main
函数;其中,"call 8048491
"是汇编指令。- 其对应机器指令为“e8 d7ffffff”,e8即跳转之意。
- 本来正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba
- 这条指令将调用位于地址8048491处的foo函数;输入/foo查找foo函数,如下图:
- 当执行“e8 d7ffffff”时,CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值。
- 当执行“e8 d7ffffff”时,CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值。
- main函数调用foo,对应机器指令为“ e8 d7ffffff”,
- 那我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。
- 用Windows计算器,直接 47d-4ba就能得到补码,是c3ffffff。
- 下面我们就修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff。
- 用
cp pwn1 pwn2
复制文件,以保留修改前文件;并用vi编辑pwn2
- 用
- 可执行文件中因为已经汇编为机器代码,在我们看来就是一堆乱码,因此我们需要将他的显示模式切换为16进制模式,即输入
Esc+:%!xxd
。 - 之后,输入
/d7
查找e8d7ffffff
(可以多查找几次,以防有重复字段,一般关键词前后十个字节一致,就是查找目标值)
- 找到目标之后回车确认,输入
r+c
,r+3
,将d7
修改为c3
输入
:%!xxd -r
将16进制转换为原格式并存盘退出vi。
再输入
objdump -d pwn2 | more
反汇编看一下,call指令是否正确调用getShell
+ 运行一下pwn1和pwn2
+ pwn1 功能:显示用户输入的内容
+ pwn2功能:实现shell功能
4. 所遇到的问题及其解决方法
4.1 问题1
描述:无法运行
pwn1
以及pwn2
,如图:
解决方法:它提示我权限不够,添加
sudo
或是用su
命令进入root
权限都不可以运行。查看文件属性之后,我意识到我在首次编辑pwn2
时由于输入错误异常退出,于是我将该文件删了,在同一名字下重新编辑,这样操作可能导致文件权限被改变。于是,我将文件重新命名后正常修改后执行即可。结果在此。