网鼎杯2020 朱雀部分writeup

Reverse –go

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
替换了base64字典

解题思路:
程序将我们输入的key,经过换了编码字典的base64加密后,去掉最后==,计算key加密后的长度,长度为0x16,就开始解密。那么我们只需要输入正确的key就有flag了,知道了base64加密字典XYZFGHI2+/Jhi345jklmEnopuvwqrABCDKL6789abMNWcdefgstOPQRSTUVxyz01,和密文nRKKAHzMrQzaqQzKpPHClX==,解密如下:

在这里插入图片描述
在这里插入图片描述

Reverse –tree

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
解题思路:
先找到根节点,上面内存块为子节点,还原二叉树结构,通过调试器在内存中定位到根节点,依次还原每个子节点,当然也可以拷出来使用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后需要得到zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx,按图索骥在二叉树中获取查找方向,得到如下字符串- -:
10101111101001000001111111001000010101110100111100010010010010000001101010000100100111010111111101110001001000001111100010011100
转ascii:
afa41fc8574f12481a849d7f7120f89c
整理下格式:
flag{afa41fc8-574f-1248-1a84-9d7f7120f89c}

flag{afa41fc8-574f-1248-1a84-9d7f7120f89c}
解密代码:
在这里插入图片描述
在这里插入图片描述

Pwn-Magic

题目逻辑:
在这里插入图片描述
1是创建多大空间 并保存你输入的字符串
2根据索引释放空间
3 根据索引打印对应的字符串

解题思路:
在忘记魔法的函数里,释放空间是根据给定的索引来释放对应的空间。但是删除的时只free,而没有设置为 NULL,这里是存在 Use After Free 的情况的。

在这里插入图片描述
同时还提供了这个函数:
在这里插入图片描述
可以修改的输入字段为 magic 函数的地址,从而实现在执行“使用魔法”即调用输入的字符串的时候执行 magic 函数。
也可以自己构造一个system(/bin/sh),我这里采用的是后者。

学习魔法创建的内存结构如下

Magic
Name ptr

我们通过写name的时候,覆盖magic:

原理:
对于大小为(16 Bytes~ 64 Bytes)的堆块来说则是使用fastbin,在fastbin中,是由单项链表连接起来的,每个chunk的pre_chunk指向之前回收的chunk,即回收的chunk出于链表头部,此时分配时也会从头部分配。
这里的magic分配空间为0x10,显然是一个 fastbin chunk(大小为 16 字节)。
我们通过连续申请空间,形成一个链表,释放链表头的空间后,再次申请内存会从头部分配。
即我们最后申请magic2的而空间保存到chunk0中,由于没有将释放的指针置空,我们再次调用第0个magic,就会将最后magic2填入的name给执行了。

步骤:
学习魔法,申请空间0,0x100,大小要不同于0x10 maigc的大小
学习魔法,申请空间1,0x100
忘记魔法,释放空间0
忘记魔法,释放空间1
学习魔法,申请空间2,大小为 0x10,和magic申请的一样大,那么根据堆的分配规则
空间2 其实会分配空间1 对应的内存块,这时name对应的是magic 0地址。
如果我们这时候向magic 2 的name写入 需要执行的地址(system啥的),那么由于没有置magic 0为NULL。当我们再次尝试输出magic 0 的时候,程序就会调用magic2处的代码。

代码:

在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章