1、Primer靶机下载地址: https://pan.baidu.com/s/1rYDOK-EDZDEfEYk2_IfRMg
2、靶机开放了80、22、8888端口,访问80端口,是该ROP的一些提示:

给出了ssh的账号密码为:level0 : warmup
3、SSH登录后,可以看到有两个文件,一个flag,一个level0的可执行程序,flag文件只有level1才可参看,level0是没有权限查看的:

4、运行level0看一下:

5、file查看一下,可以看到是32位Linux文件类型:

6、从网页上以及disassemble main中可以知道,gets这里就是漏洞利用之处:

7、checksec看一下,开启了哪些防护选项:

只开启了NX保护,其它都没开启,完全满足使用ret2libc技术
8、pattern_create 100,作为输入level0,报错在0x41414641处,通过pattern_offset计算可以得知“溢出点”在44的位置
9、可以再通过“python -c ‘print “A”44 + “C”4 +”E”4+”F”20’” 生成相应的字符串加以确定溢出点是否正确
10、通过GDB调试,基本可以确定EIP可控, 接下来使用vmmap查看内存映射,寻找一块可读可写和可执行的内存块:

11、网页提示已经说得很明白了, 可以使用mprotect、read shellcode,于是查找mprotect和read的地址,分别是mprotect(0x8523e0)和read(0x80517f0)
12、接下来通过ropgadget查找可用的pop3ret,pade插件已集成,直接查找:

13、如果要比对这个地址是否正确,可以将level0的程序丢 http://ropshell.com 验证一下:

14、OK,尝试写下exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import struct def addr(x): return struct.pack("<I",x) mpro = 0x80523e0 padding = "A" * 44 payload = addr(mpro) payload += "FAKE" payload += addr(0x080ca000) payload += addr(0x1000) payload += addr(0x7) print padding + payload |
15、运行 python exp.py > input
再次用gdb运行level0时,将input文件中的内容作为输入:

此时查看vmmap,0x80ca000~0x80cb000这块内存地址已被更改为RWX权限了。
16、最终EXP运行:

查看flag文件:
1 2 |
cat flag flag{rop_the_night_away} |
bingo!