当前位置: 代码迷 >> 综合 >> BUUCTF-----Crackme
  详细解决方案

BUUCTF-----Crackme

热度:90   发布时间:2023-12-06 14:37:47.0

1.老规矩,拿到文件,进行查壳

收集信息,无壳,32位程序

2,试着运行一下

发现就是一个类似于登录的东西

3.拖入ida中,进行分析

找到大体的函数,进行简单的代码分析

大概是这个样子

先跟进我们遇到的第一个函数sub_404090,通过分析可以知道,是这个函数对v7进行了处理

里面大概就是这个样子,

我们可以得到我们输入的用户名没有改变,改变的是byte_416050数组

先放到一边,分析下一个函数sub_401830

我们来理一下,求根据用户名求密码的大概思路

这个时候我们输入的密码,暂时储存在v6中

跟进sub_401830函数

我们输入的密码的形参为a2,跟踪a2

发现a2又传给了v8

其实到这里,我就不行了,求助大佬后,对这些伪代码又加了点注释

接着v8里面的东西又传到了v9,随后又到了v15中

我肯定是不会,我只会啊巴啊巴,这些注释是在看大佬的wp后才知道其中的奥秘 

这个时候我们就开始使用OD进行动态调试得到byte_416050的东西

该怎么动态调试呢?

这个时候我们直接寻找byte_416050的地址肯定是不好找的

那么我们知道什么?

我们知道我们寻找的数组进行了异或,我们这个数组的周围有个sub_401710函数

所以在汇编中肯定存在call sub_401710(调用sub_401710函数)

我们直接来到汇编代码的最顶端

跟踪call函数

找到满足条件的call

1。调用了sub_401710函数

2.调用的上方不远处有xor(异或)

所以我们可以知道发生异或的地址为00401B3E

这个时候打开OD进行动态调试

并且记录下 byte_416050的值

在B3E处设置断点,并且注意观察寄存器的值(上图还未绕过反调试)

注意我们前面已经发现了反调试。所以在进行动态调试之前要把反调试nop掉

最后得到byte_416050的值为[0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd]

 编写脚本,解密

box = [0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd]
a =[100,98,97,112,112,115,101,99]
for i in range(8):print(hex(a[i]^box[i])[2:],end = '')

最后得到结果

4eb5f3992391a1ae

再带到网站进行md5加密

最后得到flag{d2be2981b84f2a905669995873d6a36c} 

带到网站验证

正确!!!!