前段时间参加了NSCTF(绿盟举办的ctf),题目总体而言不是很难,其中有两题exp的高分题还挺有意思的,这里记录下当时写的exp1500的writeup。

题目要求在win7 64位以上的环境(开启DEP和ALSR)下溢出一个程序,使得弹出计算器,漏洞程序在这:http://pan.baidu.com/s/1c07EimG(提取码9y8t)。

脱壳之后,经过IDA分析之后发现,该程序存在缓冲区溢出漏洞,在ENCRYPT中有漏洞,可以构造ROP利用该漏洞:

nsctf1

这个“函数”(不完整的函数,看汇编可知没有push ebp)中,返回地址离变量v5距离为0x200512):

nsctf2

加密方法是现随机生成掩码表,然后用掩码表与接受到的数据异或,将结果存放在v5为起始地址的栈上,由于传输数据格式为:

nsctf3

2字节长度最大为65535,远远超出了0x200512),所以可以构造数据来覆盖返回地址。

通过发送STATUE可以得到进程PE结构在内存中的起始地址,而PE头与text段是相邻的:

nsctf4

所以可以利用该地址执行任意text段中的代码,刚好提供了ShellExecuteA函数:

nsctf5

text段起始地址的偏移为 0x401530 – 0x401000 = 0x530,加上PE头的长度,可以动态获取该地址为STATUE返回地址 + 0x530 + 0x1000:

nsctf6

通过OD跟踪可知,执行的文件名偏移为esp+0x3c

nsctf7

所以只要将calc的文件路径写入该偏移。

ENCRYPT中用掩码表进行异或,所以要先获取掩码表,然后将shellcode与得到掩码表异或后在发送即可。攻击成功如下图(WIN7 64位 开启ALSR+DEP):

nsctf8

攻击代码如下(由于虚拟机里面没装python,就直接拿c++写了):

 

 

 

观看更多有关 的文章?

*

+
跳转到评论