crackMe

  • 程序信息
  • 题目分析
    • main函数分析
    • sub_401830关键函数分析
    • 动态调试byte_416050
  • 求解
  • 总结

程序信息

  这道题目来自于哪个实际比赛,我没有去找,我个人是从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函数检查了输入是否为字母或者数字,这里正常输入即可,然后用于存储的变量名我改了下,方便后面查看。


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


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


  反编译后的代码如下所示,可以看到还是很难看,是一系列的赋值操作,这里只截了一部分,前面是Congratulations:),后面是try again,还需要注意这里直接将result赋值为1,并且返回。所以前面的代码也就好理解了,v3永远都为1,printf(&v4)打印try again,printf(&Format)打印Congratulations:)。


  接着看下sub_401090这个函数,就是将用户名执行了一系列操作赋值给了byte_416050这个数组,具体细节就不分析,后面可以通过动态调试得出。

sub_401830关键函数分析

  接下来看看这个关键函数,首先是第一个while循环,解释放在代码注释中。举例来说,这段代码的意思就是,假设输入密码为39d09ffa4cfcc4cc,然后两位一组切割,0x39 0xd0 0x9f 0xfa 0x4c 0xfc 0xc4 0xcc存放到v14中,后面while循环中有个异或运算就是用这个两位一组切割后的密码去参与运算的。


  如下截图所示,是关键函数的第二个while循环,这里我直接给出结论,先看注释,然后逆着来分析。首先return必须返回true,即v13 == 0xAB94要成立,v13的成立和v16-2相关,所以结合v13可以从sub_401470反推出v16-2;然后结合用户名user从sub_401710再反推出v16,最后通过动态调试得出byte_416050再与v16异或即可得到两位一组分割过后的密码,注意这里循环次数为8,代表分组后为8位即实际密码为16个字符。原密码的话就是两位分组分割后的密码拼接起来即可。


  先看sub_401470,如下截图所示,只截了一部分,a2就是v16-2,让每个if判断中的a2等于对应字母就可得到v13 == 0xAB94,这里还有一行反调试,没有截图出来,大家自行判别就好,最后解出来v16-2为dbappsec


  我们再看sub_401710函数,如下截图所示,最开始的if判断中StartupInfo.dwX等等也是反调试代码,如果处于调试的话就会执行这里面的代码。然后我们注意一下v4count,v4是user用户名的长度,count是两位一组后的密码分组个数计数,v4是永远大于count的,所以这里只会执行else if中的语句,也就是将v16与用户名进行异或。因此我们将v16-2与用户名进行异或即可得到v16。

动态调试byte_416050

  最后就剩byte_416050数组了,动态调试的话需要去除反调试代码的干扰,举例如下,如下截图所示,将jz指令改为jmp即可,jmp对应的操作码为0xEB


  如下截图所示,第一个图展示了应该打断点的地方,第二个图标红的两个地方是关键代码,我们可以看到byte数组的值是放在了ecx中来进行异或的,所以调试的时候观察ecx就行,最终得出的结果是0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd


求解

  下面给出求解脚本:

v16_2 = "dbappsec"
user = "welcomebeijing"v16 = []
for i in range(8):temp = ord(v16_2[i])^ord(user[i])v16.append(temp)
print(v16)passwd = ""
byte_416050 = [0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd]
for i in range(8):# 网上大部分的wp答案# passwd += hex(byte_416050[i]^ord(v16_2[i]))[2:] # 4eb5f3992391a1aepasswd += hex(byte_416050[i]^v16[i])[2:]print(passwd)
# 39d09ffa4cfcc4cc

  这里就和网上的答案,包括buuoj的flag不一样了,如下截图所示,用我这个脚本算出的密码去跑程序是没有问题,但md5后提交flag是不行的。网上的答案是4eb5f3992391a1ae,我脚本中也给出了,就是少了一个函数的分析,直接用的v16-2来进行运算的,答案肯定是通不过程序的,但md5后的flag是可以提交到buuoj上的

BUUCTF crackMe 题解相关推荐

  1. BUUCTF reverse题解汇总

    本文是BUUCTF平台reverse题解的汇总 题解均来自本人博客 目录 Page1 Page2 Page3 Page4 Page1 easyre reverse1 reverse2 内涵的软件 新年 ...

  2. BUUCTF crackMe

    太菜了 做了好久没做出来,参考其他师傅的解答总结一下 题目背景: 老规矩,Ex PE打开,32位无壳程序,用IDApro打开:主程序如下: 主体是一个while循环,如果我们想让while结束,我们就 ...

  3. [羊城杯 2020]easyre 1题解

    一步一个脚印地耐心攀登,就是别去看顶峰,而要专注于在爬的路.                                                                       ...

  4. [GXYCTF2019]luck_guy1题解

    无论风暴把我带到什么样的岸边,我都将以主人的身份上岸.                                                                         ...

  5. BUUCTF-RE XOR

    参考到了大佬的文章:<BUUCTF逆向题解>--xor 尤其是shift+e提取数据的操作是第一次见到 查壳后用ida64打开,可以看到在打印Sucess上面if语句中global保存了我 ...

  6. 【BUUCTF】Crypto题解

    文章目录 MD5 一眼就解密 Url编码 看我回旋踢 摩丝 password 变异凯撒 Quoted-printable Rabbit 篱笆墙的影子 RSA Alice与Bob 丢失的MD5 RSA ...

  7. BUUCTF题解——萌萌哒的八戒

    题目来源:BUUCTF 题目名称:萌萌哒的八戒 题目描述: 萌萌哒的八戒原来曾经是猪村的村长,从远古时期,猪村就有一种神秘的代码.请从附件中找出代码,看看萌萌哒的猪八戒到底想说啥 注意:得到的 fla ...

  8. buuctf web warmup详细题解

    题目:warmup 题目来源:buuctf 分析过程: 1. 首先ctrl + u 查看源代码,我们发现有一个source.php文件 2. 我们打开source.php文件,是一段代码,这道题要我们 ...

  9. 160个crackme 024详细题解(动态指令)

    0x4012DD处开始向后的三条指令是关键 004012DD  lods dword ptr ds:[esi];  从[0x4011ec处开始,每次向后取4个字节(高端存取法),进行异或运算],直到执 ...

  10. Buuctf [网鼎杯 2020 青龙组]jocker 题解

    目录 一.主函数逻辑 二.wrong函数和omg函数--假flag 1.wrong函数 2.omg函数 3.假flag 三.encrypt和finally函数--真flag 1.打开sp指针偏移显示 ...

最新文章

  1. 阿里某员工论坛炫耀:感谢公司让毕业不到两年的我年入百万
  2. Csharp: 拼音转汉字字符搜索字符串
  3. 理解Java中的弱引用(Weak Reference)
  4. 注意力机制YYDS,AI编辑人脸终于告别P一处而毁全图
  5. python自动测试p-使用python+requests实现接口自动化测试
  6. 仪表指针样式_PS教程!教你绘制拟物仪表盘拟物图标
  7. python中的路径问题汇总
  8. kappa和lambda对比 | 程序员硬核评测
  9. linux打开光盘文件怎么打开方式,ISO是什么文件?用什么打开?
  10. Redis学习总结(8)——Redis常见使用场景总结
  11. android textview电话号码,Android应用开发之Android EditTextView 实现带空格分隔的输入(电话号码,银行卡)...
  12. WebSocket 协议 RFC 文档(全中文翻译)
  13. 统计学贾俊平第六版pdf下载|贾俊平统计学第六版pdf下载电子书
  14. 多功能表单填报系统V1.2.1-适用于在线报名系统、调查、数据收集等系统应用
  15. Audition 如何录制电脑内部声音
  16. VS2013中添加现有窗体项
  17. 爬虫实例二:爬取拉勾网招聘信息
  18. CCNP-Spanning-Tree
  19. github 免费图床
  20. 题解 - CF613D Kingdom and its Cities

热门文章

  1. windows 10 主题美化
  2. linux 下spi的使用 ,cc2500模块驱动
  3. 在Android Studio创建第一个Android项目
  4. 收集的tracker
  5. python学习笔记12:t分布、f分布和卡方分布曲线绘制及临界值和p值计算
  6. python numpy安装教程_python 环境下安装 numpy
  7. Android 百度地图定位
  8. iot软件测试,IoT研发测试工程师
  9. WPS加载项部署运行问题排查方法
  10. 康复医学导论计算机PPT课文,康复导论ppt课件.pptx