昨天朋友告诉我电科新生赛开始了,本着摸鱼的心态去做了做,都是很基础的题,可惜有一道游戏题没有做出来。那就分享一道我觉得比较有意思的题。
老规矩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
from pwn import *
context.log_level='debug'
r = remote('120.25.225.38',3225)
payload = str(7308620127270928385)
r.sendline(payload)
r.interactive()
7270928385)
r.sendline(payload)
r.interactive()