BUUCTF crackMe 题解

本文详细解析了BUUCTF中一道名为crackMe的逆向工程题目,涉及程序信息、main函数及关键函数sub_401830的分析,以及动态调试过程。通过动态调试和代码分析,作者发现网上流传的解决方案存在疏漏,无法通过程序本身的验证,提出了自己的解题思路和脚本,强调了反调试和反编译技巧在解决此类问题中的重要性。
摘要由CSDN通过智能技术生成

程序信息

  这道题目来自于哪个实际比赛,我没有去找,我个人是从buuoj上刷到的,位于re部分第二页,题目只有一分,做出来的人也比较多,看起来应该是个简单的题目。
  之所以要写这个wp,是对题目的答案存在一些疑问,网上也有很多wp,我都看了一下,大致都出自于同一个人的手笔O(∩_∩)O。我个人感觉网上的wp分析过程都漏了一步,虽然这样得出的flag可以通过buuoj,但是这是个crack题目,网上wp的答案无法通过程序本身,我个人分析得出的答案是可以通过程序本身的。

题目分析

main函数分析

  下面开始分析整个题目,这里我就不改题目中的函数名了,直接使用IDA的命名。首先先说下这道题目的用意,用户名已知welcomebeijing,然后根据程序求解正确的用户密码,最后md5就是flag,所以密码求解是否正确是可以用程序本身来验证的。另外这道题目难点主要在两个,第一是代码略长,处理过程略显复杂;其二是用了很多反调试的代码,调试时需要处理一下。
  如下图所示,最开始main函数中使用了两个do-while循环,v0 = sub_4024BE(); fflush(v0);应该是用于刷新缓冲区的,对题目不影响;sub_401000函数检查了输入是否为字母或者数字,这里正常输入即可,然后用于存储的变量名我改了下,方便后面查看。

crackMe-1
  如下图所示,是main函数中接下来的步骤,我们先看两个if语句,满足的话则break,所以sub_401830是关键性的处理函数。然后还有一个就是v3的值,该值由函数loc_4011A0返回,下面我们先看下这个函数。

crackMe-2
  该函数点进去后,本身无法反编译,问题出在下面这个地方,jbeaaa那行,在IDA中找到对应的十六进制直接修改为nop指令,然后选中所有左侧标红的地址,快捷键p重新定义为一个函数,此时再执行反编译操作即可。

crackMe-3
  反编译后的代码如下所示,可以看到还是很难看,是一系列的赋值操作,这里只截了一部分࿰

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值