[src = hackme] rop
题目描述
1 | nc hackme.inndy.tw 7704 |
Tips: Buffer Overflow, ROP
WP
用IDA打开下载的rop可执行文件,发现在overflow()函数里面的gets()调用处存在栈溢出。且溢出的变量在ebp-Ch的位置,所以举例返回地址为0xC+0x4的举例,即16个字节,也就是要在返回地址前面覆盖16个字节的任意数据。
用checksec查看安全机制开启情况:
1 | bitsec@bitsec-ubuntu:~/hackme/rop$ checksec rop |
开启了NX机制(栈不可执行Windows平台上称其为DEP),意味着栈不可执行,也就意味着不能直接向栈里面写入shellcode,此时就应该使用ROP(Return-Oriented Programmming Exploit)机制了。攻击者从已有的库或可执行文件中提取指令片段,构建恶意代码。其主要思想是在栈缓冲区溢出的基础上,通过利用程序中已有的小片段(gadgets)来改变某些寄存器或者变量的值,从而改变程序的执行流程,达到预期利用目的。
然后使用readelf查看该程序使用的是静态库还是动态库。
1 | bitsec@bitsec-ubuntu:~/hackme/rop$ readelf -d rop |
发现没有使用动态段,这样以来,问题就更简单了,直接使用直接用ROPgadget –binary rop –ropchain 就可以生成好rop利用链了。
输出如下的ROP链:
1 | - Step 5 -- Build the ROP chain |
结合前面的16字节的任意填充,基于python的pwntool,编写下面的exp程序:
1 | #!/usr/bin/env python2 |
执行得到shell,cat flag得到flag。