(一)出处:

    shiyanbar中的一个ctf练习题,题目大概意思是:网页上给定一个sha1的hash值,这个hash值是1-100000中随机的一个整数先通过‘md5‘hash一次,然后再通过’sha1‘hash一次。如果能在两秒之内得到这个值,再输入并提交则过关。题目链接:http://ctf5.shiyanbar.com/ppc/sd.php . 截图下:

速度爆破-shiyanbar的一个编程题_第1张图片


(二).分析:

    既然是编程题,当然得编程来完成,思路也很简单。笔者用的python。

    1.要求要在两秒钟之内完成,相对来说,效率肯定要高:

        python的效率在大多数情况相对低级语言来说要低很多,瓶颈所以要竟可能快的得到这个整数,如果先得到网页给定的hash值然后在逐个整数循环计算比较,那就是在浪费这两秒,为了避免时间的不足,这两秒只完成三个任务:

            1.获取网页上的hash值。

                得到网页上的sha1值,方法很多,beautifulsoup或者re或者xpath等等,re的底层是C实现的,所以效率相对较高,笔者用的是xpath,re是默认自带的库,其他两个是三方库里的,需要提前安装。

            2.找出这个整数。

            3.提交这个整数。

    2.要存储这些整数所对应的hash值:

        笔者是使用列表来存储的,查询过程最多消耗100001次,现在绝大部分处理器都是足以胜任的。

    3.最好伪装成浏览器:

        有些验证可能会对浏览器代理有要求,养成这个习惯还是挺好的,有时可能会写爬虫。

    4.post我们得到的值:

        要post数据给服务器,首先要得到表单的参数,可以通过浏览器自带的代码检查,或这firebug之类的插件,便可分析出来,笔者用的是wireshark,也可以用其他抓包软件,如下图:

        速度爆破-shiyanbar的一个编程题_第2张图片

(三).效果如下:

    执行脚本后返回的结果里面有通关所需的东西,终端编码有点问题所以显示的乱码:

速度爆破-shiyanbar的一个编程题_第3张图片


(四).贴上代码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import hashlib
import requests
from lxml import etree

#The list of saving hash value of these integer 
l = []

#The User-Agent of Browser
header = {"User-Agent":"Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0"}

#Target url
url = "http://ctf5.shiyanbar.com/ppc/sd.php"

#Caculate hash value and save it to list
for  i in range(1,100001):
	md5 = hashlib.md5()
	sha1 = hashlib.sha1()
	md5.update(str(i))
	sha1.update(md5.hexdigest())
	l.append(sha1.hexdigest())
	
#Get target page and obtain the sha1 value on this page
ss = requests.Session()
ctt = ss.get(url, headers = header).content
xml = etree.HTML(ctt)
sha = xml.xpath('//div[@name="sha1"]/text()')[0]

#Search the hash value and get index value on the list
for index ,value in enumerate(l):
	if sha == value:
		#post the integer that corresponding the sha1 value 
		data1 = {"inputNumber":index+1}
		result = ss.post(url,data = data1, params = header).content
		break
		
#Output return page's content
print(result)

(五).说明

    这种方式用处还是挺大的,比如登录验证,或者暴力破解登陆验证,或这自动化登陆等等。不过现在很多登陆页面都加入了验证码机制或更高级的机制,稍微会麻烦写,不过现在机器识别还是很强大的,可以用其作为辅助,从而完成更加艰难的任务。


(六).如有错误,还请斧正.