首页
社区
课程
招聘
[原创]看雪.京东 2018CTF 第六题 PWN-noheap---------WriteUp
发表于: 2018-6-28 10:33 5590

[原创]看雪.京东 2018CTF 第六题 PWN-noheap---------WriteUp

2018-6-28 10:33
5590

pwn题,老样子,先用checksec noheap查看保护状态

保护全开...好吧

先看init

首先init里对函数地址进行了xor加密,并设置了几个全局变量的值,暂时还不知道其作用。

再来看main函数

main来看程序应该是有两关,第一关是猜数字,第二关是漏洞利用。

程序会根据/dev/urandom生成的4字节随机数,进行计算,并打印出一个hash值,然后问你原数是多少,由于是用4字节的随机数,并且范围是 [0x30, 0x2Bu + 0x30)所以可以直接穷举。

第一关的穷举代码如下。

hash值传入work就能得到对应的4字节随机数,回写通过第一关

过了第一关后,程序会展示出它的功能

这几个功能里,能有问题的估计也就是Malloc了,看它代码

限制分配空间<= 0x80,读取输入的大小为输入的size - 1,所以这里如果输入size0时,就可以读取到一个0xFF长度的串到src中,src的大小为0x80后面紧跟的是一开始init中初始化的那些个以g_value_开头的全局变量

经过动态调试发现,这些全局变量其实是一个指令表,根据不同指令走一个switch case做一些计算,赋值,跳转等操作。函数如下:

从这个表里可以看到,这个流程直接赋予了读取栈中数据和写入的能力,所以可以根据栈里情况读取到libc中函数实际地址,也可以读取到程序自身函数的实际地址,然后根据可读取到的地址与需要的目标函数地址的固定偏移,计算得到目标的实际地址。

有了这些能力就可以构造rop,将/bin/sh,写入到指令表中并计算出地址,由于提供了libc所以可以根据栈中其他libc函数地址计算出system地址,构造rop跳转给func_addr执行利用。

所以重点就是精心构造指令表来执行上面的逻辑,再把这个指令表通过read的越界替换原始指令表,达到偷天换日的效果。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
请问一下,我这个switch case的无法f5转换成c需要怎么设置一下呀?
2018-7-31 16:54
0
雪    币: 273
活跃值: (465)
能力值: ( LV15,RANK:848 )
在线值:
发帖
回帖
粉丝
3
之幽灵 请问一下,我这个switch case的无法f5转换成c需要怎么设置一下呀?
在IDA的 Options->General->Disassembly 里勾选Stack pointer,然后看函数里哪个地方的SP是负数,用alt+k进行调整
2018-8-2 00:51
0
游客
登录 | 注册 方可回帖
返回
//