1.实验内容
本次实验以Linux环境下的可执行文件pwn20232411为操作对象,围绕缓冲区溢出漏洞进行注入实验。主要是通过技术手段篡改程序执行流程,触发原本不可运行的getShell函数或者自定义 的shellcode。包括直接修改程序机器指令,改变程序执行流程;通过构造输入参数,造成BOF攻击,改变程序执行流;注入Shellcode并执行。
2.实验过程
1.直接修改程序机器指令,改变程序执行流程
(1)首先反汇编pwn20232411,找到main,foo,getshell三个函数。
(2)由图可知,main函数在第十二行跳转了foo函数,我们需要更改其跳转地址,使其跳转getshell函数。第十二行机器指令是e8 d7ffffff,即执行EIP + d7ffffff的指令。EIP为下条指令的地址,即80484ba;d7ffffff是补码,表示-41。因此要使其跳转getshell函数修改d7ffffff为,getShell-80484ba对应的补码,即c3ffffff即可。接下来进行修改。
(3)修改完毕,进行验证。
提权成功。
2. 通过构造输入参数,造成BOF攻击,改变程序执行流
(1)首先反汇编pwn20232411,了解程序功能
(2)可以发现foo函数存在缓冲区溢出漏洞,foo函数第六行读入字符串但没有限定读入字符串最大数目,可以溢出覆盖返回地址,现在用gdb调试,确认输入多少字符串能覆盖返回地址。
(3)可以看见输入1111111122222222333333334444444455555555时,eip(返回地址)被覆盖0x35353535即5555。再次尝试1111111122222222333333334444444412345678,eip被覆盖为0x34333231,即4321(高位优先)。由此可以确定返回地址位置。getShell的内存地址为0804847d,由于高位优先构造输入字符串:11111111222222223333333344444444\x7d\x84\x04\x08,生成包括这样字符串的一个文件,并将其作为pwn1的输入。
提权成功。
3. 注入Shellcode并执行
(1)进行准备工作,关闭Bof攻击防御技术。使用patchelf关闭堆栈可执行,并关闭地址随机化。
(2)构造payload,选择"\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"作为shellcode,生成包括shellcode的一个文件。接下来确定\x4\x3\x2\x1该填什么,用一个终端注入这段攻击buf,用另外一个终端进行gdb调试。
(3)在foo函数结尾部分设置断点,可以看见\x4\x3\x2\x1位于0xffffcf6c,因此确定填写0xffffcf70。创建payload文件进行攻击。
3.问题及解决方案
- 问题1:execstack不存在且无法安装。
- 问题1解决方案:通过询问AI,得到与其相似的指令patchelf,通过patchelf关闭堆栈可执行。
- 问题2:shellcode注入失败,显示管道破裂
- 问题2解决方案:我构造payload的时候只更改了\x4\x3\x2\x1的内容没有去更改开头的部分,导致注入失败。
4.学习感悟、思考等
本次实验让我对缓冲区溢出漏洞有了一个粗浅的认识,了解了一些基本的注入方法。虽然不够全面,但是为我今后的学习也算打下了一个基础。