吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3299|回复: 10
收起左侧

[CTF] 算法分析一道逆向CTF题

[复制链接]
Panel 发表于 2022-3-10 23:14

算法分析一道逆向CTF题

1.下载查壳,跑一遍

1

1

2

2

提示输入,随便输入后结束程序

2.使用IDA静态分析,拖进去直接F5伪代码分析

3

3

 v7 = strcmp(byte_40336C, aXircjR2twsv3pt);
    if ( v7 )
      v7 = v7 < 0 ? -1 : 1;
    if ( !v7 )
    {
      sub_401020("right\n", Arglist[0]);
      system("pause");
    }

从伪代码中可以看到关键字符"right\n",那这里可以直接看出这个sub_401020指定就是输入正确后的提示函数,但是要执行sub_401020函数则需要v7是一个非零的数,那么我们就跟踪v7,可以从整个main函数中看到,对v7变量做出更改的只有一下两个地方

v7 = strcmp(byte_40336C, aXircjR2twsv3pt);
if ( v7 )
      v7 = v7 < 0 ? -1 : 1;

第一个地方v7是byte_40336C变量与aXircjR2twsv3pt变量strcmp的返回值,第二个地方v7无论怎么样都是非零数,所以第二个地方的v7就不影响提示输入正确的函数sub_401020("right\n", Arglist[0]),那只有第一个地方的了,化简后的对比代码如下

 v7 = strcmp(byte_40336C, aXircjR2twsv3pt);
 if ( !v7 )
    {
      sub_401020("right\n", Arglist[0]);
      system("pause");
    }

也就是说,只要byte_40336C与aXircjR2twsv3pt相等就行了,相等v7就等于0,!v7就为真,那就执行提示输入正确的函数,到这里根据以往的经验就可以有90%的信心确定这个byte_40336C就是最后一次flag的密文,我们只需推到出这个byte_40336C就应该可以解决题目了

那好,接下来找出aXircjR2twsv3pt的具体值,双击aXircjR2twsv3pt进入查看具体值

4

4

shift+e把aXircjR2twsv3pt提取出来先放好,继续查看aXircjR2twsv3pt与byte_40336C存在的逻辑

for ( i = 0; i < 0x18; ++i )
      byte_40336C[i] = (byte_40336C[i] + 1) ^ 6;

我们刚才得到最后的byte_40336C正确的满足条件就是等于aXircjR2twsv3pt,那在上面的代码中就只存在一个未知数:每次循环前的byte_40336C,那我们先用刚才提取出的aXircjR2twsv3pt写脚本推导出每次循环前的byte_40336C,代码如下:

#include <stdio.h>
#include <Windows.h>

int main()
{
    unsigned char aXircjR2twsv3pt[] =
    {
        0x78, 0x49, 0x72, 0x43, 0x6A, 0x7E, 0x3C, 0x72, 0x7C, 0x32,
        0x74, 0x57, 0x73, 0x76, 0x33, 0x50, 0x74, 0x49, 0x7F, 0x7A,
        0x6E, 0x64, 0x6B, 0x61, 0x00, 0x00, 0x00, 0x00
    };
    char get[24];
    for (size_t i = 0; i < 0x18; i++)
    {
        get[i] = (aXircjR2twsv3pt[i] ^ 6) - 1;
    }
    for (size_t i =0; i < 0x17; i++)
    {
        printf("%c", get[i]);
    }
    system("pause");
}

5

5

到这里以后,我们继续阅读main函数代码逻辑,发现在这个for循环之前只有一个地方操作了这个byte_40336C变量,但是即使再怎么操作byte_40336C变量的最后操作都是for循环结构内,所以再for以前的代码毫无意义了,那此时我们得到最后的条件就是上面输出的“}NsDkw9sy3qPto4UqNx{galf”字符了,所以只能通过这个字符串来查找关键信息最快,咱们不如把“}NsDkw9sy3qPto4UqNx{galf”倒序看一下,是不是有flag{...}这味?那我们把for循环输出从最后一位开始倒序

6

6

脚本如下:

#include <stdio.h>
#include <Windows.h>

int main()
{
     char aXircjR2twsv3pt[] =
    {
        0x78, 0x49, 0x72, 0x43, 0x6A, 0x7E, 0x3C, 0x72, 0x7C, 0x32,
        0x74, 0x57, 0x73, 0x76, 0x33, 0x50, 0x74, 0x49, 0x7F, 0x7A,
        0x6E, 0x64, 0x6B, 0x61, 0x00, 0x00, 0x00, 0x00
    };
    char get[24];
    for (size_t i = 0; i < 0x18; i++)
    {
        get[i] = (aXircjR2twsv3pt[i] ^ 6) - 1;
    }
    for (size_t i = 0x17; i >=0; i--)
    {
        printf("%c", get[i]);
    }
    system("pause");
}

7

7

提交正确了,其实有个经验便是:CTF有时候更像脑筋急转弯

免费评分

参与人数 3威望 +1 吾爱币 +21 热心值 +3 收起 理由
qpm + 1 + 1 我很赞同!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Q1998 + 1 热心回复!

查看全部评分

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

MattSeeker 发表于 2022-3-10 23:27
研究一下
iloveasdl 发表于 2022-3-11 08:49
Clearloveu 发表于 2022-3-12 00:02
lbg2222000 发表于 2022-11-30 15:24
可以学习下,感谢分享
makmak79 发表于 2022-12-1 11:28
学习了,感谢分享
guodaojide 发表于 2023-4-17 23:45
不错不错不错不错不错不错不错不错不错不错
shuahtbcfff 发表于 2023-4-18 08:06
学习了,有样本可以发下吗
 楼主| Panel 发表于 2023-4-18 09:23
shuahtbcfff 发表于 2023-4-18 08:06
学习了,有样本可以发下吗

时间太久了,记不得是那题了
abde 发表于 2023-5-6 22:01

学习了,感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-5-3 23:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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