-
-
[原创]看雪.京东 2018CTF 第六题 PWN-noheap---------WriteUp
-
发表于:
2018-6-28 10:33
5591
-
[原创]看雪.京东 2018CTF 第六题 PWN-noheap---------WriteUp
pwn题,老样子,先用checksec noheap
查看保护状态
保护全开...好吧
先看init
首先init
里对函数地址进行了xor
加密,并设置了几个全局变量的值,暂时还不知道其作用。
再来看main
函数
从main
来看程序应该是有两关,第一关是猜数字,第二关是漏洞利用。
程序会根据/dev/urandom
生成的4字节随机数,进行计算,并打印出一个hash
值,然后问你原数是多少,由于是用4字节的随机数,并且范围是 [0x30, 0x2Bu + 0x30)
所以可以直接穷举。
第一关的穷举代码如下。
将hash
值传入work
就能得到对应的4字节随机数,回写通过第一关
过了第一关后,程序会展示出它的功能
这几个功能里,能有问题的估计也就是Malloc
了,看它代码
限制分配空间<= 0x80
,读取输入的大小为输入的size - 1
,所以这里如果输入size
为0
时,就可以读取到一个0xFF
长度的串到src
中,src
的大小为0x80
后面紧跟的是一开始init
中初始化的那些个以g_value_
开头的全局变量
经过动态调试发现,这些全局变量其实是一个指令表,根据不同指令走一个switch case
做一些计算,赋值,跳转等操作。函数如下:
从这个表里可以看到,这个流程直接赋予了读取栈中数据和写入的能力,所以可以根据栈里情况读取到libc中函数实际地址,也可以读取到程序自身函数的实际地址,然后根据可读取到的地址与需要的目标函数地址的固定偏移,计算得到目标的实际地址。
有了这些能力就可以构造rop
,将/bin/sh
,写入到指令表中并计算出地址,由于提供了libc
所以可以根据栈中其他libc
函数地址计算出system
地址,构造rop
跳转给func_addr
执行利用。
所以重点就是精心构造指令表
来执行上面的逻辑,再把这个指令表通过read
的越界替换原始指令表,达到偷天换日的效果。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课