C/C++教程

BUUCTF crackMe

本文主要是介绍BUUCTF crackMe,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

太菜了 做了好久没做出来,参考其他师傅的解答总结一下

题目背景:

老规矩,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}

 

 

这篇关于BUUCTF crackMe的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!