(十八)、first
First

一、查壳

Elf文件
二、IDA静态分析
1、字符串搜索


2、浏览代码逻辑

byte_602180是我们输入的字符串

程序在这里对字符串进行了处理

这里创建了线程,点开回调函数

其中,sub_400E10是md5摘要算法
qword_602120是已有数据的数组
unk_602220是要输出的数据

代码逻辑比较简单,我们只需要逆向出byte_602180即可
这里还要注意到程序中互斥锁的使用,我们需要考虑到线程执行先后顺序的所有情况

三、写出解密脚本
import hashlib #qword_602120 = [0x0F59BB02BDBB4647,0x5CFCE8EC2128ACBE,0x0EF0375CA659274AD,0x27422CC18FB38643,0xA72DECA745CC3EB0,0xE8341712FE5F3CBE] qword_602120 =["4746bbbd02bb590f", "beac2821ece8fc5c", "ad749265ca7503ef", "4386b38fc12c4227", "b03ecc45a7ec2da7", "be3c5ffe121734e8"] #根据函数可以发现密文是4个字节 #爆破 ans = 0 qwe = 0 for a in range(48,126): for b in range(48,126): for c in range(48, 126): for d in range(48, 126): apart = chr(a) + chr(b) + chr(c) + chr(d) # m = hashlib.md5() # m.update(apart.encode("utf8")) m=hashlib.md5(apart.encode("utf8")).hexdigest() for f in range(0,6): if m[0:16] == qword_602120[f]:#出错原因:将16进制数用str转化会变成10进制字符串 print(f,end=" ") print(apart) ans = ans+1 if ans == 6: print("结束") exit()

四、排列组合试一遍

只得到了一个假的flag..
提交到攻防世界却不对
返回main函数
五、重新查看代码逻辑


byte_60221F 好像与 dword_602220 指向的位置十分相似
我们手动写出解密脚本
input1='juhuhfenlapsiuerhjifdunu' input2='juhuhfenlapsdunuhjifiuer' byte_6020DF=[0xfe,0xe9,0xf4,0xe2,0xf1,0xfa,0xf4,0xe4,0xf0,0xe7,0xe4,0xe5,0xe3,0xf2,0xf5,0xef,0xe8,0xff,0xf6,0xf4,0xfd,0xb4,0xa5,0xb2] len=24 i=0 v11=0 while(i!=len): v12=ord(input1[i])+i v11=v11^v12 i=i+1 flag='' for i in range(24): temp=ord(input2[i])^v11^byte_6020DF[i] flag+=chr(temp) print(flag)
用input1做实验,得到:

我们重新进行排列组合,最后发现了,juhuhfenlapsdunuhjifiuer 组合得到的结果最像flag

这就是最后的flag
六、拿到flag
goodjobyougetthisflag233
七、总结
六个线程产生数据的随机排列,md5加密算法(对md5算法还不是很了解),最后还需要字节写出解密脚本拿到flag
我还有一个疑惑,为什么运行程序,输入 juhuhfenlapsdunuhjifiuer 后却显示错误,不应该直接拿到flag嘛,如果juhuhfenlapsdunuhjifiuer 是不正确的,为什么 本该正确的juhuhfenlapsiuerhjifdunu得到的flag 又不对呢。。。无语

浙公网安备 33010602011771号