20232420 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容

  • 1)对目标文件pwn1,直接修改文件内容,使程序执行时跳转到getShell函数。
  • 2)对目标文件pwn1,利用缓冲区溢出漏洞,覆盖返回地址,触发getShell函数。
  • 3)对目标文件pwn1,注入一个shellcode并运行。

2.实验环境

VMware 虚拟机 Kali 系统。

3.实验过程

  • 先复制两份pwn1文件。
    屏幕截图 2025-10-13 163919

3.1 直接修改程序机器指令,执行getShell

  • 对目标文件pwn1反汇编。
    屏幕截图 2025-10-13 170434
    屏幕截图 2025-10-13 170444
    屏幕截图 2025-10-13 170535
  • main函数在80484b5处要调用foo函数,正常流程CPU会执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41 = 0x29,80484ba + d7ffffff = 80484ba - 0x29正好是8048491这个值,最终会跳转到08048491处执行foo函数。
  • 那么想要使其最终跳转到0804847d处执行getShell,只要修改“d7ffffff”为"0804847d - 80484ba"对应的补码就行,即c3ffffff。
    屏幕截图 2025-10-13 171801
    屏幕截图 2025-10-13 171657
    屏幕截图 2025-10-13 140050(1)
    屏幕截图 2025-10-13 140137(1)
  • 再次反汇编查看main函数,可以发现原本调用foo函数已被改为调用getShell函数。
  • 修改前:
    屏幕截图 2025-10-13 140441(1)
  • 修改后:
    屏幕截图 2025-10-13 140412(1)
  • 运行pwn20232420_1,有shell提示符#。
    屏幕截图 2025-10-13 172845

3.2 构造输入参数,造成BOF攻击

3.2.1 观察foo函数

  • 反汇编观察foo函数,注意到三行代码。
    屏幕截图 2025-10-13 141341(1)
  • 此处存在缓冲区溢出漏洞,缓冲区大小为28字节,但gets函数不会检查目标缓冲区的大小,可能导致缓冲区溢出。

3.2.2 确认输入字符串哪几个字符会覆盖到返回地址

  • 使用gdb调试
    屏幕截图 2025-10-13 174035
  • 先输入1111111122222222333333334444444455555555,eip的值为0x35353535
    屏幕截图 2025-10-13 142006(1)
  • 再输入1111111122222222333333334444444412345678,eip的值变为0x34333231
    屏幕截图 2025-10-13 142105(1)

3.2.3 覆盖返回地址

  • getShell的内存地址,通过反汇编时可以看到,即0804847d。注意eip的值是变为0x34333231,所以应该输入11111111222222223333333344444444\x7d\x84\x04\x08来覆盖返回地址。
  • 构造输入字符串
    屏幕截图 2025-10-13 142858
  • 然后将input的输入,通过管道符“|”,作为pwn1的输入,成功执行getShell。
    屏幕截图 2025-10-13 143218

3.3 注入Shellcode并执行

3.3.1 准备一段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\

3.3.2 准备工作

  • 设置堆栈可执行,并关闭地址随机化。
    屏幕截图 2025-10-13 175820

3.3.3 构造要注入的payload

  • 采用结构为:anything+retaddr+nops+shellcode。
  • 要确定shellcode的位置。
    屏幕截图 2025-10-13 163427
  • 上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。我们得把它改为shellcode的地址。
  • 打开一个终端注入这段攻击buf:
    屏幕截图 2025-10-13 180440
  • 再开另外一个终端,用gdb来调试pwn1这个进程。
    屏幕截图 2025-10-13 180903
    屏幕截图 2025-10-13 180856
  • 通过设置断点,来查看注入buf的内存地址。
    屏幕截图 2025-10-13 161332
  • 在另外一个终端中按下回车,继续。
    屏幕截图 2025-10-13 161339(1)
  • 看到01020304了。
  • shellcode的地址就是0xffffd2fc+4=0xffffd300,将原先的\x4\x3\x2\x1更换为\x00\xd3\xff\xff。
    屏幕截图 2025-10-13 163520
    屏幕截图 2025-10-13 163856
  • 成功注入shellcode。

4.问题及解决方案

  • 问题1:学习通上的execstack无法使用。
  • 问题1解决方案:到网上下载execstack,复制到虚拟机内安装。

5.实验感悟

  • 三个实践内容展示了三种不同的获得shell的方法,直接改写文件、利用bof漏洞和注入shellcode。跟着实验步骤走的过程中,简单了解了汇编指令、bof漏洞原理与利用、shellcode的注入方法,见识了网络攻防的冰山一角,在静态的实验环境下尚且要用许久,真实的攻防只会更加复杂。

参考资料

posted @ 2025-10-13 20:06  20232420刘镇瑜  阅读(3)  评论(0)    收藏  举报