吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2187|回复: 78
收起左侧

[CTF] 【2023】春节解题领红包之二

  [复制链接]
梦旅意中人 发表于 2023-2-6 00:09
本帖最后由 梦旅意中人 于 2023-2-8 17:47 编辑

工具

吾爱破解专用虚拟机,IDA Pro 7.5

其实这道题比较直接的方式是根据历年题目的答案使用穷举法猜出答案,不过要是猜不出的话也没关系,这是大佬的手法,学不来的(大佬有技术,有手法,我们要是靠猜的话遇到变化的题就又搞不定了),我们小白还是要试着去分析得到正确的答案。

查壳

001查壳.png

可以知道程序无壳,可以直接开始分析。先运行程序,输入测试用例,查看输出。

002输出.png

根据提示信息可知,key的长度不足,以此为切入点进行分析。

OD调试

003主页面.png

由于程序无壳,所以可以直接使用字符串搜索工具,右键->中文搜索引擎->智能搜索。

004字符串搜索.png

很快可以看到 Length Error,please try again,双击此行可以回到汇编窗口。(此处可以发现还有Success,Wrong...等字样,可以先留意一下,如果直接在Success处分析,对初学者来说,可能容易犯迷糊,所以先从已知的条件入手)

005字符串列表.png

很快可以发现对应代码上方有一个je(相等则跳转)向下的跳转,再向上可以看到cmp指令,根据其对应的一个操作数为0x1D(十进制数29),和上方读取内存地址数据操作,可以断定password长度为29。

006length汇编1.png

构造长度为29的字符串,abcdefghijklmnopqrstuvwxyzabc,再次输入,提示信息变为“Wrong,please try again”,结合之前提到对字符信息的分析步骤,在字符窗口中使用同样的操作找到对应汇编代码位置。

007length汇编2.png

在它的上一行可以发现一个来自0040141A的跳转(向上滑动或者直接Ctrl+G搜索该地址),

008length汇编3.png

定位到此处发现它刚好跳过了Success,而我们的目标是需要让它不执行跳转,因此继续向上分析,可以发现上面又有一条cmp指令(cmp比较两个操作数是否相等,使用减法操作,如果结果相等即为0,那么右边对应的Z标志位就会变为1),既然JNZ(Z标志位为0时则跳转,此时表示两个操作数结果不相等)与它有关,使用F2在此下一个断点即可。

009success定位.png

重新载入程序,按F9使其运行,输入abcdefghijklmnopqrstuvwxyzabc,此时回车后程序将在00401417处暂停,这里要注意红框圈起来的地方,可以看到密码第一位为应该为f,而我们输入的是a,所以程序继续向下执行就会提示答案错误,此处一种思路就是如此重复操作29次,确定出最终答案。这里可以看出今年官方的出题不同以往,以前可以在寄存器窗口看到用cmp直接比较最终结果的方式,可以比较容易知道最终的结果,这一次是逐位比较了。

010逐位比较.png

当然我们可以选择继续向上分析,cmp指令上一行为sar ebx,0x2,也就是对ebx中的数据做右移两位的操作后,再赋值给ebx,再向上可以看到mov指令,取出内存地址的值赋值给ebx,此处的dword ptr ds:[esi*4+0x43F000],根据F8单步执行分析,esi每次会自增1,即每次从数据取出四个字节的十六进制数据, 而数据窗口的值为98 01 00 00,而我们看到左下角的值为00000198 ( 0x198 >> 2 = 66 = 'f'),这是因为数据窗口的数据遵循小端序的规则。大小端序是计算机内存中一种存储多字节数据的排列方式,由于计算机电路优先处理低位字节,这种存储方式被广泛应用于现代CPU内部存储数据,这也是为什么有的教程中修改数据时,需要将数据反过来写的原因。

因此程序执行的思路如下,首先判断长度是否正确,然后循环按位比较输入的字符是否与实际的password的值,由于password的值做了移位处理,因此需要先要进行右移2位后将其还原,再进行比较,如果使用F8单步调试会发现从004013F0到00401429就是循环并逐位比较的代码部分。

011逐位比较代码分析.png

在数据窗口中选择116字节数据,将其转为大端序,98 01 00 00 => 00 00 01 98

012数据窗口字节.png

或者使用如下操作获得对应的十进制数。

013长整型.png

对其进行右移两位操作后,转为ascii码即可,即为最终答案。文末有Java代码实现。

408,432,388,412,492,212,200,320,444,296,420,404,200,192,200,204,288,388,448,448,484,312,404,476,356,404,388,456,500

014长整型2.png

最终结果为 flag{52PoJie2023HappyNewYear}

IDA分析

上面的循环部分的汇编或许看起来会比较吃力,所以可以选择使用IDA帮我们理清思路。打开IDA选择文件,点击ok即可。

016ok.png

待程序加载完成,可以看到很清晰的看到其运行的流程图,在此页面按下F5即可将其转换为源代码。

017graph.png

这里很容易就已经看到success的提示,不难看出第22行为判断长度,第29行为右移逐位比较是否相等,31行判断是否比较完成。结合之前的分析分析就对程序有很清楚的了解了。

018伪代码.png

代码

class Solution {
    public static void main(String[] args) {
        int [] arr = new int[]{
            408,432,388,412,492,212,200,320,444,296,420,404,200,192,200,204,288,388,448,448,484,312,404,
            476,356,404,388,456,500
        };
        for(int c : arr){
            System.out.print((char)(c>>2));
        }
    }
}

其它题解

【2023】春节解题领红包之三https://www.52pojie.cn/thread-1742449-1-1.html
【2023】春节解题领红包之四https://www.52pojie.cn/thread-1742785-1-1.html
【2023】春节解题领红包之web篇——不完美题解https://www.52pojie.cn/thread-1743080-1-1.html

免费评分

参与人数 7威望 +1 吾爱币 +26 热心值 +7 收起 理由
ivorist + 1 + 1 谢谢@Thanks!
笙若 + 1 + 1 谢谢@Thanks!
lydy + 1 + 1 用心讨论,共获提升!
Janling + 1 + 1 谢谢@Thanks!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gcy167223 + 1 + 1 我很赞同!
danshiyuan + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 梦旅意中人 发表于 2023-2-8 18:00
本帖最后由 梦旅意中人 于 2023-2-8 18:02 编辑
lsd8058055 发表于 2023-2-8 16:57
求指导:
Q1:在IDA中,怎么看出来第22行是判断字符串长度的呢???
Q2:29行的v14[0]与doword_43F000的值 ...

你好:
A1:IDA这个我其实是作为上面OD调试的补充的,因为有人对汇编比较陌生,就看起来比较吃力,所以把这个贴出来便于理解,你可根据OD的0x1D = 29得知这里是判断字符串长度的,也可以根据这个源码来理解,屏幕截图没截完,它这个if条件不满足的话后边会执行else里面的内容,那里就是提示lengthError的语句。你感兴趣可以用IDA打开看看。
A2:这个其实确实需要你和OD来看了,我没记错的话,OD里面你能看到一条sar的命令,它就是对应这里右移(>>)的操作,那么就可以肯定这里是判断v14[0]和doword_43F000右移的值,或者你可以看看我以前写的题解帖中有讲过IDA的动态调试的部分,动态调试以后你将鼠标放在那个变量上他就会提示代码运行起来这里显示的值了。
ivorist 发表于 2023-2-8 13:26
我明白了,我一直都是用的OllyDBG.EXE,原来是用吾爱破解
Hmily 发表于 2023-2-6 16:09
@云在天 大家都会按往年答案穷举了

点评

明年换套路。  详情 回复 发表于 2023-2-7 02:47
lunrey 发表于 2023-2-6 08:53
看上去好简单,但操作起来,我连打开哪个软件运行都不知道
danshiyuan 发表于 2023-2-6 10:26
我以为简单的还像往年一样,能找到明文。眼睛就看花了也没找到。好难
 楼主| 梦旅意中人 发表于 2023-2-6 10:40
lunrey 发表于 2023-2-6 08:53
看上去好简单,但操作起来,我连打开哪个软件运行都不知道

不难的,你跟着帖子就可以做了,哪里不会你可以留言。
 楼主| 梦旅意中人 发表于 2023-2-6 10:41
danshiyuan 发表于 2023-2-6 10:26
我以为简单的还像往年一样,能找到明文。眼睛就看花了也没找到。好难

这次的确实稍微麻烦一点,不太像往年那样可以看到,但是也是可以找到的。
wendao_lx 发表于 2023-2-6 11:35
我使用的方法和上面差不多
ivorist 发表于 2023-2-6 16:27
我要收藏学习学习,看看能不能解出来
Janling 发表于 2023-2-6 20:10
讲解的很详细
lydy 发表于 2023-2-6 20:58
原来IDA还能转换源代码呀,我这是白搞了半天
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 23:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表