这题做的时候思路出现问题,看着wp抠了很长的时间才弄出来。
smc md5爆破 srand值的预测
程序的逻辑没什么问题。 图片.png 图片.png来算下6位的字符串0的个数*10+0等于403的情况。
图片.png
前面不存在是因为10个0,sum不可能是303的,后面不存在0超过14位的。
from itertools import permutations
from hashlib import md5
table=string.ascii_lowercase
match=''
j=0
for res in permutations(table,6):
j+=1
if j % 100000==0: print float(j)*100/308915776
proof=''.join(res)
tmp=md5(proof).hexdigest()
a1=0
a2=0
for i in range(len(tmp)):
if tmp[i]=='0':
a1+=1
a2+=i
if 10*a1+a2==403:
match+=proof+'\n'
print proof
print match
爆破找到符合的字符串:ozulmt
md5加密之后为:0ec448d42dbf0000c020c0000048010e
关键分析decode函数
图片.png
(其实里面是324字节,只解密运算305个)
使用ida找到check函数
图片.png
截取出来
图片.png
逐字节读出,进行解密
图片.png 图片.png
再将check 覆盖保存,重新载入查看check部分。
图片.png 图片.png
#include<stdio.h>
#include<stdlib.h>
int main(){
srand(300);
int i;
printf("flag{");
for (i=0;i<32;i++){
int a=rand()%16;
if (i==8) printf("-");
if (i==12) printf("-");
if (i==16) printf("-");
if (i==20) printf("-");
if (a<=9)
printf("%c",48+a);
else
printf("%c",97+(a-10));
}
printf("}");
return 0;
}
网友评论