buuctf crackMe

 

题目给了一个exe文件,运行要求输入账号密码,

 

 其中账号题目已经给了(一开始题目没仔细看以为账号密码都要自己弄。。)

查看文件信息,

 

32位无壳,直接在IDA中反编译,找到_wmain函数

 

 while循环里输入账号密码,然后用sub_401000函数判断是否是由数字和字母组成的

接下来sub_401090函数创建了一个数组,由user的值来确定,账号已经是确定的,所以byte_416050数组其实也是可以确定的

 

 接着往下看,第43行通过loc_4011A0赋值v7和v5,在OD中动态调试可以看到分别是"congratulations"和"please try again"

 

 所以就是输出v7还是v5的问题了,要得到flag自然是要输出v7,那么就要进入下面的if语句,

 

这就取决于sub_401830这个函数了,跟进查看

函数分为两部分,第一部分将密码每两位合并成一个十六进制数,认真分析其实不难看出

 

 

第二部分做加密操作,

 

先看return的值,说明最后var208=43924,var208的赋值在sub_401470函数中,跟进查看

 

其实就是根据v17的字符来确定var208做的运算,这里一共有9个if判断条件,一般来说都不会进else部分的。。只有v17[5]有两个if判断语句分出了几种情况,知道var208最后的值可以反推出v17最后的值为"dbappsec",往上找到v17的赋值,它其实是有前面生成的byte_416050数组和由密码生成的数组异或得出的

 

用OD动态调试可以得到异或时的byte_416050数组(看汇编代码,找到对应的while循环,在异或的时候byte_416050数组的值存在ecx寄存器里,一遍一遍跑就行了)

然后要注意的是有几个反调试的地方

 

 

 

 

 

 在OD调试的时候要注意步过,还有sub_401710这个函数

 

虽然是个反调试,但我觉得这就是给我看看的。。,似乎没起到反调试的作用吧。。进if语句就是了。

总之最后脚本如下

 

 得出的flag用md5加密就可以了,最后的flag为flag{d2be2981b84f2a905669995873d6a36c}


 

posted @ 2020-08-10 12:42  Th1r7een  阅读(134)  评论(0)    收藏  举报