题目地址BUUCTF在线评测
1.首先看看程序有没有壳
无壳,32位,直接放到ida32里
看main函数jmp到了main_0里了,那就看main_0,直接F5大法
2.逐条分析代码,大概就是先第一次输入密码,然后进行各种拼接和校验,然后输入第二次密码,拼接并校验
3.这里直接说几个重要函数吧,首先就是atoi函数,它会将把字符串转换成整型,简单演示一下
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ret = atoi("123.1");
printf("%d", ret);
}//123
然后就是sub_40100A函数,点进去看下
看大佬的wp这就是个hash加密函数,具体看这位大佬的wp,重点看这个0x8004,它对应的加密方式是sha1,具体可以看这张表去比对,加密后的数会和6E32D0943418C2C33385BC35A1470250DD8923A9去进行比较所以我们就可以写脚本去爆破出第一次的密码了
import hashlib
for i in range(100000,1000000):#因为前面校验了密码的长度为6位,且数值大于100000
key = str(i)+"@DBApp"
if hashlib.sha1(key.encode('utf-8')).hexdigest()=="6e32d0943418c2c33385bc35a1470250dd8923a9": #注意这里比较的是小写,从ida上复制的是大写
break
print(key)
#123321@DBApp
然后继续接着走,输入第二次密码,同样校验了长度,但是没有校验数值的大小,所以应该前面的爆破就不能用了
4.在第二次输入密码后它使用了sub_401019函数对密码进行了处理
同样还是个hash加密,但它使用的是0x8003,对比前面的表,知道了是MD5加密
那到这里就可以直接对加密后的MD5值进行在线解密了,然后删除第一次的密码,就会得到第二次的密码了,看其他大佬的wp是手动解的,我这里应该是前人栽树,后人乘凉了,MD5解密直接就解出来了
得到第二次密码~!3a@0
5.最后往后看找到sub_40100F函数
具体是什么没仔细去看,重要的是它Create了一个名为dbapp.rtf的文件,应该就是如果前面的密码校验全通过,就会生成一个dbapp.rtf文件,rtf是一个word文档类型的文件
5.最后我们输入得到的两次密码,就会有dbapp.rtf文件了,为了方便展示程序运行完的结果,我们直接用动态调试
成功得到flag
我这里演示的是后来者的版本,有些地方没去了解,更详细的可以看这位大佬的wp