
下载文件后用die查看,发现是32位无壳

于是将其在ida中打开查看伪代码,根据我做题的习惯一般第一步不是直接去查看主函数,而是直接去查看字符串,然后根据字符串可以看出一些东西

这里我发现这个没有base64编码的东西,而且看到了一个输入函数,所以我们跟进,跟进就是直接点击进去,然后用ctrl+X进行查看

然后它会跳转到一个汇编语言的地方

然后我们就可以通过f5来查看它的伪代码了

这里可以看到,一共有两段密码,第一段密码好像是通过一个运算,然后跟一个字符串进行匹配,而且这个输入是6字节,纯数字,这里数了一下字符串,发现长度为40,然后继续查看它的这个转换函数

然后就看到了一些看不懂的东西,但是这个Hash还是认识的,于是猜测可能是进行了hash的运算,然后长度为40,这里可以给出关于hash的一些运算函数
def get_md5(message): #32位长度
md5=hashlib.md5() #首先创建对象
s=message.encode()
md5.update(s)
result=md5.hexdigest()
return result
def get_sha256(message): #64位长度
sha256=hashlib.sha256()
s=message.encode()
sha256.update(s)
result=sha256.hexdigest()
return result
def get_sha1(message): #40位长度
sha1=hashlib.sha1()
s=message.encode()
sha1.update(s)
result=sha1.hexdigest()
return result
第一个是Md5,结果得到的是32位的小写字母,第二个是sha256,结果是64位的字符串,第三个是sha1,结果是40位的字符串
所以这个应该就是sha1了,那么我们就可以通过爆破解出来
这里给出解密代码:
s="6E32D0943418C2C33385BC35A1470250DD8923A9".lower()
s1='@DBApp'
for i in range(100001,1000000):
k=str(i)+s1
sha1=get_sha1(k)
if s==sha1:
print(k)
注意这个需要引用hashlib这个库,如果没有的话可以通过pip install hashlib直接下载
运行结果为123321那么第一段结果就是123321@DBApp,这个在后面还是会用到的
第二个key也是长度为6,但是就是有一个问题就是这个没有给定范围,但是即便如此,我还是直接去爆破,然后就老实了。。。
毕竟这个数字实在是太大了,6层循环......
第2个要匹配的字符串长度是32位,所以应该是md5,但是我总是感觉理论上应该是可以爆破出来的,但是这个爆破不出来说明可能在哪里还有提示,只是我还没有发现

看了一下,发现最后还有一个函数,点进去看看

发现这个东西根本看不懂,然后查了一下发现,这个是在进行一个查找资源并且获取这个资源的一个操作,首先通过FindResourceA()第二个是资源ID,第三个是资源类型,如果没有找到就放回0,然后通过SizeofResource()获取资源大小,然后通过LoadResource()将查找的资源,加载资源数据到内存,最后就是通过LockResource将这个资源锁定,然后处理!
这里有一个软件,做这个题还是很至关重要的,就是查看这个获取的资源!这个软件的名称就是Resource Hacker.可以去这个网址下载
Resource Hacker
然后我们打开这个软件,将这个文件放进去,就可以看到,一个ID是101的,然后类型是AAA的资源

但是这个确实是看不懂的,所以先放着,继续网下分析,下面还有一个函数

这个函数的第一个参数是那个Str,是通过这个进行MD5转化然后进行比较的,这个长度是18位,第二个参数是上面的那个资源,第三个为长度,这里我们目标明确,是要求这个Str,然后解出这个文件
对于这个Str,我们也只需要关注前6位就欧克了,因为后面的那些东西我们已经知道了
看了一下这个代码,主要是进行异或运算,将这个Str的每一位与这个获取的资源进行异或运算,那么这个运算的结果是什么呢,那么我们就得回到前面去分析了

可以看到,在函数运行完之后,好像创造了一个.rtf文件,猜测这个函数运行的结果应该得到了一个rtf文件
于是现在我们去试着打开一个rtf文件


又搜了一下,发现刚好6位,说明这个6位是通过那个Str和获取的资源前6位进行异或运算得到的,那么获取这个Str可以通过{\rtf1与那个资源的前6位进行异或运算得到
资源前6位为:05 7D 41 15 26 01
rtf文件前6位为:{\rtf1
下面给出异或代码加MD5加密结果
k1="123321@DBApp"
s=r"{\rtf1"
s1="05 7D 41 15 26 01"
# print(int("7D",16))
def fun(str):
return int(str,16)
lst=list(map(fun,s1.split()))
s1=''
for i in range(6):
s1+=chr(ord(s[i])^lst[i])
print(s1)
print(get_md5(s1+k1))
# s="27019e688a4e62a649fd99cadaafdb4e"
这个结果与s的结果是一样的,说明第二个key值解出来了,这里我们解出来还需要进行一步操作,就是!运行程序!!

然后得到了一个rtf文件

打开就是flag

Flag{N0_M0re_Free_Bugs}