直接上IDA,在函数中找不到main函数,shift+12看看字符串有没有什么蛛丝马迹。
这里有几个关键的地方。第一条短红线应该就是主程序运行到flag的地方。第二条大伙就很熟悉了,是base64加密的原表。
这里先点You found me进去看看
然后ctrl+x 和 f5看看代码。
这里代码看的很乱,按照自己的思路重命名一下。这里有一个小技巧memset下面一搬跟着read和scanf函数,顾sub_4406E0这个函数很可能是read和scanf,下面先改名成为read。sub_424BA0这里呢多次出现在if判断语句里面还与数字进行判断,我觉得是计算字符串长度的strlen函数。
笔者对v12[12]=127和v13[3]=127和0LL这里的分别按r再撤销一次。
这里就可以开始阅读分析代码了。
这里应该是个比较函数,比较v11和off_6cc090的值。v11=sub_400E44(v10)我们先去看看sub_400E44是什么东西
感觉像是base64编码的样子,继续点aAbcdefghijklmn进去看看
看到这里可以确定是base64编码了,现在点off_6CC090进去提取base64内容解码看看,这一段就是编码后的内容。Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ==
进行多次解码。解码结果https://bbs.pediy.com/thread-254172.htm
进去网站看看,这里进了干扰项,得重头来过。
继续阅读代码看看。发现这部分代码挺可疑的。
于是向看看v13[i]^i的结果。编写exp,这里给了个屁话提示。想过离开~~~
然后,开始漫无目的在代码里面逛街,有函数就点进去看看。
最终发现!这里有可疑的字符串。
然后ctrl+x查看byte_6CC0A0
然后将102和103按r看看
f,g 这里就要想到flag,说明了这里很有可能是真正的关键函数。
这里先把代码的变量关系捋一捋。v1=v4,byte_6CC0A3和byte_6CC0A0其实是可以看做同一个数组里但是下角标不同。
接着看sub_410E90函数的内部构造
这里太复杂了。不管了,返回去分析他的代码。这里我把代码分为三部分。
第一部分,应该是个加密部分,将v1也就是v4加密。
第二部分就是判断部分,但是在这个判断部分呢,我们能找到出很多有用的信息。
由v1^byte_6CC0A0[0]='f'和HIBYTE(v4) ^ (unsigned __int8)byte_6CC0A3) == 'g'
这里补充一下HIBYTE(v4)是指V4的高位的值,由于V1=V4也就是V1高位的值。
这里我们就可以猜测出来
*v1^byte_6CC0A0[0]=v1^byte_6CC0A0=‘f’,*v4^byte_6CC0A0[3]=v4^byte_6CC0A3=‘g’
*v2^byte_6CC0A0[1]=v2^byte_6CC0A1=‘l’,*v3^byte_6CC0A0[2]=v3^byte_6CC0A2=‘a’
第三部分sub_410E90((unsigned __int8)(byte_6CC0A0[j] ^ *((_BYTE *)&v4 + j % 4)))我们主要看里面这部分(byte_6CC0A0[j] ^ *((_BYTE *)&v4 + j % 4))
这部分可以看出byte_6CC0A0[j] ^v4[j%4]
那我们如何求出这部分的值呢。要求这部分就要有byte_6CC0A0的数组内容和V4的数组值。
byte_6CC0A0的内容如下
shlft+e提取出16位数据。403520565D182245172F246E623C2754486C246E723C32455B
V4是一个数组看下面的计算v4的exp
最后编写整体的exp计算flag
def flag_result():
str1 = "403520565D182245172F246E623C2754486C246E723C32455B"
result = []
test = ['f', 'l', 'a', 'g']
flag = []
for i in range(0, len(str1), 2):
result.append('0x' + str1[i] + str1[i + 1])
test1 = []
for i in range(4):
test1 += chr(ord(test[i]) ^ int(result[i], 16))
print(test1)
for i in range(25):
flag += chr(int(result[i], 16) ^ ord(test1[i % 4]))
print(''.join(flag))
['&', 'Y', 'A', '1']
flag{Act1ve_Defen5e_Test}