2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解
一、实验内容
1、掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分)
2、掌握反汇编与十六进制编程器 (0.5分)
3、能正确修改机器指令改变程序执行流程(0.5分)
4、能正确构造payload进行bof攻击(0.5分)
二、实践目标
1、本次实践的对象是一个名为pwn1的linux可执行文件,如图:
2、该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串;
3、该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。
我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三、实验内容及步骤
直接修改程序机器指令,改变程序执行流程:
通过修改main函数中的call指令跳转的地址,使其本来该跳转到foo函数时,跳转到getshell函数,从而运行getshell函数。
任务一:
1、输入指令objdump -d pwn1反汇编文件 pwn1,结果如图所示:
分析结果中的main、foo、getShell函数,call 8048491 <foo>是汇编指令,将调用位于地址8048491处的foo函数;
其对应机器指令为e8 d7 ff ff ff,e8即跳转之意;
call指令调用函数对应的机器指令为:“e8”+“该函数相对于EIP值的偏移量”,让main函数调用getShell,修改“d7ffffff”为,
“getShell地址 - EIP(80484ba)”对应的补码就行(804847d - 80484ba),得到结果为c3 ff ff ff。
2、输入指令vi pwn1,文件以ASCII码的形式出现;
3、输入:%!xxd调用命令行,将文件转换为16进制,如图所示:
4、输入/d7,查找要修改的内容:
5、输入i转换为插入模式,d7修改为c3:
6、输入:%!xxd -r,将文件转换为ASCII码形式,输入:wq保存并退出;
7、再次反汇编查看,
8、再次运行修改后的pwn1文件,得到shell提示符:
任务二:通过构造输入参数,造成BOF攻击,改变程序执行流
知识要求:堆栈结构,返回地址
学习目标:理解攻击缓冲区的结果,掌握返回地址的获取
实验步骤:
1、确认返回地址,输入指令objdump -d pwn1反汇编文件 pwn1,查看getshell()的内存地址
2、gdb调试pwn1,输入r运行程序,这里遇到点问题:
gdb报告信息:Detaching after fork from child process 4487(该问题尚未解决)。
任务三:注入Shellcode并执行
shellcode是一段机器指令,通常这段机器指令的目的是为获取一个交互式的shell,所以这段机器指令被称为shellcode。
实验步骤:
1、输入apt-get install execstack安装execstack,设置堆栈可执行:
execstack -s pwn3 //设置堆栈可执行
execstack -q pwn3 //查询文件的堆栈是否可执行;
2、more /proc/sys/kernel/randomize_va_space //查看随机化是否关闭
'echo "0" > /proc/sys/kernel/randomize_va_space //关闭随机化;
安装过程:
3、构造要注入的payload;
4、在一个窗口运行(cat input_shellcode;cat);
5、在gdb里面attach 2396调试;
6、在ret指令的地址处设置断点,
7、在另一个终端按下回车,这样程序就会执行之后在断点处停下来;
8、继续运行程序;
9、查看0xffffd34c地址后面16字节的内容:
10、修改注入代码的覆盖地址,再次运行(cat input_shellcode;cat),则攻击成功!
四、实验过程中遇到的问题
1、安装execstack包时:
解决方法是更新安装源即可。
2、任务一需要输入:wq保存退出时遇到如下问题:
查阅资料后得知解决方法为输入:wq!即可。
五、实验感想
本次实验是网络对抗第一次实验,实验包含三个任务,虽然跟着步骤做并不难,但是内容较多,需要掌握的新的知识点较多。同时实验过程中我也遇到了许多复杂的问题,
但在查阅资料后也一一解决了。总的来说本次实验我完成任务的同时也收获了许多知识,为后续的学习打下良好的基础。