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

老规矩 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

1
2
3
4
5
6
from pwn import *
context.log_level='debug'
r = remote('120.25.225.38',3225)
payload = str(7308620127270928385)
r.sendline(payload)
r.interactive()
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Loτυs 微信支付

微信支付

Loτυs 支付宝

支付宝