昨天朋友告诉我电科新生赛开始了,本着摸鱼的心态去做了做,都是很基础的题,可惜有一道游戏题没有做出来。那就分享一道我觉得比较有意思的题。
老规矩 checksec 一下
基本啥保护也没开.
# 代码审计
观察主函数,只要满足 master 和 AtHome 字符串相等就能拿到 flag。因此我们的目的就是给 master 字符串赋值为 AtHome。
程序中有一处 ring 函数,点进去看看
发现是读入一个 long long 型的无符号数,再查看 bell 储存的 bss 段
思路很清晰了,只能对 bell 段进行读写,但是 bell 段读进的是一个八字节的 long long 型,而 bell 段自身储存长度只有两字节,所以可以有额外的六字节溢出,而 master 字符串和 bell 相邻,则通过溢出可达到写 master 的目的。
# 具体实现
首先,strcmp 函数是通过每个字符的 ASCII 码大小来比较的,因此查一下 ASCII 码表,发现 A,t,H,o,m,e 的 ASCII 码值对应的十六进制值分别为 41,74,48,6F,6D,65,gdb 调试一下,先在 ida 里找到 master 地址 0x6010ac,然后输入 0x410001 对应的十进制数。
根据我们之前的预测,master 处第一个字符现在应该会被覆盖成 A
猜测证实。
同理,则我们只需要输入 0x656d6f487441xxxx,就可以达到高十二位覆盖到 master 里。
# exp
1 | from pwn import * |