电科新生赛dokodemo2

昨天朋友告诉我电科新生赛开始了,本着摸鱼的心态去做了做,都是很基础的题,可惜有一道游戏题没有做出来。那就分享一道我觉得比较有意思的题。

老规矩checksec一下

1

基本啥保护也没开.

代码审计

2

观察主函数,只要满足master和AtHome字符串相等就能拿到flag。因此我们的目的就是给master字符串赋值为AtHome。

程序中有一处ring函数,点进去看看

3

发现是读入一个long long 型的无符号数,再查看bell储存的bss段

4

思路很清晰了,只能对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对应的十进制数。

5

根据我们之前的预测,master处第一个字符现在应该会被覆盖成A

6

猜测证实。

同理,则我们只需要输入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()


猜你喜欢

转载自blog.csdn.net/Invin_cible/article/details/121326474