0%

2020 网鼎杯 boom1

boom1

题目描述

boom1打开后看起来内容很多,其实很多内容都不需要逆向。首先看到下面这个字符串时,已经大致猜到了什么:

image-20200511101514250

这就类似于高级语言预订的一些关键词,那么也就是,我们用这些东西来写程序就好了。

在后面的动态运行中,我发现了,需要定义main函数,以及需要分号作为结尾。而且函数只能运行一次:

image-20200511101754172

否则就会打印NOTALLOW。

思路

修改__free_hook为system,最后调用free(“/bin/sh”);

这个程序会把我们写好的程序的变量之类的,放置在malloc的区域,而此时malloc的大小是0x40000的,也就是这一空间必然是mmap出的新空间,且与libc是相邻的,那么我们就不需要知道libc的基地址,而直接通过偏移去得到__free_hook和system的地址。

pwn!!!

首先判断libc版本,在内存中,其实是有libc版本记录的地方,在peda中使用类似:find 2.23,这样的语句就可以找到,而且总是有一个地址是与0x8对齐的,因为我们这里计算的偏移都是以0x8为一个单位。最后我计算出这个偏移为471879。计算方法就是用定义的a的地址减去目标地址,最后除以8。

image-20200511102438106

可以看到,此时打印2.23,那么原创也可以测试出来就是2.23的libc版本。

最后用类似的方法计算出free_hook和system的值就好了:

image-20200511102639601

最后的payload:main(){int a;*(&a-180998)=&a-640393;free("/bin/sh");}