速度爆破-shiyanbar的一个编程题

(一)出处:

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

(二).分析:

既然是编程题,当然得编程来完成,思路也很简单。笔者用的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,也可以用其他抓包软件,如下图:

(三).效果如下:

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

(四).贴上代码:

#!/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)

(五).说明

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

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

原文地址:http://blog.51cto.com/daye8ku/2057585

时间: 2024-10-10 04:28:21

速度爆破-shiyanbar的一个编程题的相关文章

编程题:编写一个函数string_copy()完成strcpy()的作用,并验证。

#include<stdio.h> void string_copy(char *s1,char *s2) {   for(;*s2!='\0';s1++,s2++) *s1=*s2; *s1='\0'; } void main() { char str1[20],str2[]="I like C"; char *p1=str1,*p2=str2; string_copy(p1,p2); printf("str1:%s\t str2:%s\n",str1

编程题:已知一个一维数组a[10]中有10个数,求出第m个数到第n个数的和。其中m、n由键盘输入。

#include<stdio.h> int sum(int *q,int n) { int i,s=0; for(i=0;i<n;i++,q++) s+=*q; return s; } void main() { int n,m,a[10]={1,2,3,4,5,6,7,8,9,10}; int *p; printf("Please input m and n(m<n<10):\n"); scanf("%d,%d",&m,&am

编程题:输入一个数字,实现逆排功能。

编程题:输入一个数字,实现逆排功能. #include<stdio.h> #include<conio.h> fun(int m,char *s) { char c; int k,i=10; while(m!=0) { k=m%i; *s=k+'0'; s++; m=(m-k)/i; } *s='\0'; } main() { int n; char s[81],*p; p=s; printf("enter a number(>100):"); scanf

编程题:指针变量,实参与形参的引用。已知一个一维数组,求其中前n个数的和。n由键盘输入。

#include<stdio.h> int sum(int *q,int n) { int i,s=0; for(i=0;i<n;i++,q++) s+=*q; return s; } void main() { int num,a[10]={1,2,3,4,5,6,7,8,9,10}; int *p=a; scanf("%d",&num); printf("%d\n",sum(p,num)); } 编程题:指针变量,实参与形参的引用.已知

编程题:为了展示文件包含功能,输入一个字符串,输出其长度。

1.c源代码如下: #include<stdio.h> #include"2.c" void main() { char string[20]; scanf("%s",string);         /*整个程序的功能:输入一个字符串,输出其长度*/ printf("There are %d characters.\n",string_len(string)); } 2.c源代码如下: int string_len(char str

编程题:已知一个一维数组,求其中前n个数的和。n由键盘输入

#include<stdio.h> int sum(int array[],int n) { int i,s=0; for(i=0;i<n;i++) s+=array[i]; return s; } void main() { int num,a[10]={1,2,3,4,5,6,7,8,9,10}; scanf("%d",&num); printf("%d\n",sum(a,num)); } 编程题:已知一个一维数组,求其中前n个数的和.

编程题:将数字0~5放入一个整型数组,并逆序输出数组

#include<stdio.h> void main() { int i,a[5]; for(i=0;i<5;i++)         /*给数组中元素赋值*/ a[i]=i; for(i=4;i>=0;i--)          /*逆序输出数组中元素值*/ printf("%3d",a[i]); printf("\n"); } 编程题:将数字0~5放入一个整型数组,并逆序输出数组,布布扣,bubuko.com

2018.7.20 编程题: 写一个Singleton出来。

编程题: 写一个Singleton出来. Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 一般Singleton模式通常有几种种形式: 第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法. public class Singleton { private Singleton(){} //在自己内

中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机

期末考试编程题 返回 这是期末考试的编程题 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 细胞自动机(30分) 题目内容: 这是细胞自动机的非图形版本.细胞自动机是指在一个二维网格内,每一个网格是一个细胞.每个细胞有活和死两种状态. 初始时刻,有些细胞是活的,有些细胞是死的.自动机的每一步,根据每个细胞周围8个格子内的其他细胞的生存情况决定这个细胞下一步是否存活.具体的规则如下: