昨天朋友告诉我电科新生赛开始了,本着摸鱼的心态去做了做,都是很基础的题,可惜有一道游戏题没有做出来。那就分享一道我觉得比较有意思的题。
老规矩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()
本文介绍了参与CTF比赛时遇到的一道关于代码审计的游戏题。题目要求使`master`字符串等于`AtHome`,通过分析发现程序存在缓冲区溢出漏洞。通过输入特定的数值,可以利用这个漏洞修改`master`的值。最终,通过构造payload成功实现了字符串的篡改,展示了缓冲区溢出攻击的基本思路和实施过程。
4069

被折叠的 条评论
为什么被折叠?



