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

1.实验内容

实验有三个小步骤:

  1. 反汇编打开文件,修改foo函数地址为getshell地址,让文件跳转至getshell函数执行。
  2. 利用foo函数的bof漏洞,构造包含getshell函数地址的字符串覆盖到eip地址,使函数运行跳转至getshell函数。
  3. 注入编写好的shellcode(anything+retaddr+nop+shellcode),调试函数找到滑行区地址并填写,使我们注入的shellcode能够执行。

2.实验过程

步骤一 通过修改函数地址跳转到getshell函数

输入反汇编指令 objdump -d pwn20192423 | more 得到如下结果,通过管道符|输出为more分页显示

找到main函数以及foo函数和getshell,根据实验步骤一要求,我们需要将调用foo函数入口地址修改为getshell地址。
根据计算可以得到我们应该将FFFF FFD7替换成 FFFF FFC3

利用图形化编辑器wxHexEditor打开pwn20192423,如下图所示

找到需修改的位置,将d7改为c3

反汇编pwn20192423后查看发现foo函数入口地址已经被我们成功修改为getshell入口。

运行原文件以及修改的文件,发现修改后的文件我们可以直接进入getshell中。

步骤二 构造一个攻击输入字符串,覆盖返回地址,触发getShell函数

利用gdb调试可以查看到当输入的字符串长度超过28字节后就会覆盖ebp(4字节)以及eip,可以看到ebp被覆盖为0x34343434,eip被覆盖为0x35353535

由于键盘无法输入getshell的地址,故我们需要利用perl解释语言将我们要输入的getshell地址所包含的字符串保存为in文件

Cat in 将文件中的内容显示出来通过管道符|输出执行文件./20192423pwn,并且通过cat停下当前所执行的程序。可以看到超过32字节后的数据覆盖到了eip函数返回地址,将getshell地址设置于字符串当中,我们成功通过此方法调用到了getshell。

步骤三 注入shellcode并使其运行

填充0x指令是为了啥?
制造“滑行区”让它落到我们的shellcode指令

首先关闭地址随机化,将它设置为0。

为了找到我们这段shellcode的地址,我们在一个终端中运行这个程序,另一个终端中去调试这个程序

可以看到我们这个程序的进程号为1391,进入调试。

在foo函数执行完之后(ret之后)就应该到我们所覆盖的地址上去。

可以看到0xffffd19c处已经有我们所覆盖的0X01020304,可以看到909090,找到地址填充在指令里。但若使用第一种shellcode构成nop+shellcode+retaddr,最后会发现没法成功执行,单步调试发现是由于我们的代码段是位于堆栈中的,而shellcode里有push操作,故会覆盖我们本身的指令,所以没法成功,故我们换做第二种构成 anything + retaddr + nop +shellcode,无论如何nop都要在shellcode之前,是因为我们要保证“滑行区”在我们的shellcode前面。
uploading-image-474949.png

成功了
uploading-image-312978.png

3.问题及解决方案

  • 问题1:填充出错:将字符串输入之后依然报错
    image.png
  • 问题1解决方案
    滑行区的地址填错了,使用第一种shellcode注入后调试程序所找到的地址0xffffd17c填入了第二种shellcode当中,由于两种shellcode构成不同,所以会导致滑行区所在的地址也不同,用第二种shellcode构成调试找到正确地址即可。
    image.png
    image.png
  • 问题2:运行程序显示权限不够
    image.png
  • 问题2解决方案:提升权限即可
    可使用指令chmod指令:可以修改文件或者目录的权限
    image.png

4.学习感悟、思考等

通过这次的实验让我初步接触到了网络攻防,虽然这只是一个小小的实验,但也让我意识到我们所编写的程序里有着大大小小可利用的漏洞。光是从程序里调用shell就有各种各样的方法。
此次实验也让我对汇编语言以及linux指令更加了解,学会使用工具查看程序中的机器指令,反汇编程序查看程序语句等等。

参考资料