1.实验内容
1.实验目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
- 三个实践内容如下:
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
2.实验要求
- 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
- 掌握反汇编与十六进制编程器
- 能正确修改机器指令改变程序执行流程
- 能正确构造payload进行bof攻击
2.实验过程
1.基础知识
管道符使用"竖杠"表示: |;它的作用是:连接两个命令,将第一个命令的输出作为第二个命令的输入.
more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。
objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。
Shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
2.实验步骤
1.手工修改
修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff
运行修改后的代码,可以得到shell提示符:
2.构造输入参数
确认输入字符串哪几个字符会覆盖到返回地址
由图可知,输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,接下来确认用什么值来覆盖返回地址、确认字节序
正确应用输入 11111111222222223333333344444444\x7d\x84\x04\x08
因为没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件,然后将input的输入,通过管道符“|”,作为pwn1的输入。运行,得到预期结果
3.注入Shellcode
关闭地址随机化
打开另一个终端查看pwn4进程号,并使用gdb调试这个进程
使用break *0x080484ae设置断点,并输入c继续运行;使用x/16x 0xbffff53c查看其存放内容;将之前的\x4\x3\x2\x1改为预期跳转的shellcode地址
运行成功
3.问题及解决方案
- 问题1:任务三为什么构造方式nop+shellcode+retaddr不能成功?
- 问题1解决:网上查找得知应该是寻找返回地址时定位出现了问题,没有正确找到返回地址的值,因此覆盖出现了错误
- 问题2:任务三发现每次的内存地址都不同
- 问题2解决:询问同学得知问题原因在于遗漏了关闭地址随机化这一步骤
4.学习感悟、思考等
通过这次实验我初步了解了BOF攻击的原理和方式,熟悉了一些汇编语言和机器指令,由于之前并没有这些基础,实验过程都是按照指导书和视频一步步做的,同时认识到这三个简单的任务都是在关闭堆栈保护、关闭堆栈执行保护、关闭地址随机化 等理想条件下实现的,实际情况下缓冲区溢出攻击如何实现值得我们探索。