太菜了 做了好久没做出来,参考其他师傅的解答总结一下
题目背景:
老规矩,Ex PE打开,32位无壳程序,用IDApro打开;主程序如下:
主体是一个while循环,如果我们想让while结束,我们就需要使得两个if成立;
我们首先看跟v3有关的loc_4011A0,点进去,发现无法反编译,解决办法IDA无法反编译
编译成功之后:
发现v3的值一直为1;
我们来看看sub_401830函数,主要由两个while构成,我们先来看第一个while
主要是把输入的转换成数字并且按照每两位分成一组,也就是输入a21c32ba,最后分为0xa2,0x1c,0x32,0xba,接下来看第二个while循环;
我们开始从后向前看, 最后需要输出v13==0xAB94,我们先点击进入sub_401470函数查看,
一堆的if判断,把判断条件转换为字符查看,这些字符就是大概他想要得到的字符,不是的话就执行错误的操作,最后进行验证,需要注意是这里
我们可以尝试运算一遍,应该是s,最后得到 a2的值为dbappsec 。最后我们就要求的是a数组的值了(源程序是byte_416050数组,被我改了)
怎么求呢?IDA调试,有反调试没成功,试试OD,
先在ida中找到xor异或,查看他的地址(建议先图装查看,找起来方便,再查看地址)
我们现在就要看ecx的值了(XOR destination, source为什么不是eax,怪我汇编没学好,就是xor异或和实际异或的顺序相反的,我是这么记忆的)在**1B3E处下一个硬件断点,然后输入用户名,随便输入一个密码,循环8次记录下ecx的值。
0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd
最后就是写脚本解密了。
str="dbappsec" flag="" a=[0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd] for i in range(8): flag+=hex(a[i]^ord(str[i])) print(flag.replace('0x',''),end='')
最后输出为4eb5f3992391a1ae,md5加密之后的答案为
flag{d2be2981b84f2a905669995873d6a36c}