32位exe,拖进ida
要求输入两次密码,先看第一处
可以看到CryptCreateHash的ALG_ID为0x8004,可知道是sha1,且输入为6位数字大与100000
ALG_ID可在此处查:https://docs.microsoft.com/zh-cn/windows/win32/seccrypto/alg-id
import hashlib
a="@DBApp"
for i in range(100000,999999):
m=str(i)+a
c=hashlib.sha1(m.encode())
if(c.hexdigest()=="6e32d0943418c2c33385bc35a1470250dd8923a9"):
print(m)
得到第一部分123321
再看第二处
0x8003,MD5,只知道是六位,难以爆破,不过有另一个函数sub_40100f
可以知道第二次输入密码与资源异或后为dbapp.rft,所以找到对应资源就行了。
a="{\rtf1"
b="x05x7dx41x15x26x01"
flag=""
for i in range(6):
flag+=chr(ord(a[i])^ord(b[i]))
print(flag)
==================================================================================
下面是如何找资源
==================================================================================
先用010打开
pe文件开头是MS-DOS头,在0x3c处可找到PE文件头40,数据目录表的第三个成员指向资源结构,位于PE头的88h偏移处,在这个文件里位置就是40h+88h=c8h处,此处为2F000,不过因为010好像是以binary形式表现的,所以我用了DIE
42f000就是资源的根目录处,共三个资源,此处看到的IMAGE_RESOURCE_DIRECTORY_ENTRY结构如下:
看第一个结构的名字为80000118h,可得名字在2f000+118h的位置,
第一个03表示长度,从这就可看出第一个结构就是要找的AAA
继续往下看,OffectToData为 80000028h,80h二进制为10000000b,最高位为1,表示有下一层目录,而低位数28h就是偏移,可得下一层目录为42f028
从此处可看到OffectToData为80000078h,和上面方法相同,找到42f078,
这次没有下层目录了,找到42f0d8,
2f260就是资源的实际位置
==================================================================================
对于不想知道原理的,下面是更好的方式(~_~)
==================================================================================
用DIE