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

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2965|回复: 19
上一主题 下一主题
收起左侧

[CTF] CISCN CTF rthread.bin 逆向题

  [复制链接]
跳转到指定楼层
楼主
dreamingctf 发表于 2022-9-7 14:58 回帖奖励
CISCN - rtthread是一个非常新颖的好题
题目中给的是一个 sh 文件和一个类似固件的bin rtthread.bin


运行起来,啥也没有
尝试 ?、help 等,看看会给我们提供什么信息


里面有一些提供的命令,比如 ifconfig,date 等信息


CTF 题目当然就会想要追求 flag,看到最前面的两个命令


可以看到是作者自定义的一个广告位置,真有意思~~~
然后尝试 get_flag 这个命令,得到一个迷宫


如果瞎输入的话,就是会报错的


不是上下左右键的话,就是 WASD 呗(多年来打小霸王游戏机的经验)
合理的猜想就是从 S(Start)点上下左右走到F(Finish)点
很多条可达的路径,通过 Oops 的方式 ban 掉了很多条,当然就只留下来了唯一确定的可行字符串


输入的字符串为:
dddwwawwwwaasdsasawawdwaaasawassssdwdsddssasddw


首先是判断长度,再是判断逻辑
ok,到了这里就需要开始逆向了!





可以发现,字符串是没有交叉引用的
不过既然函数不是很多,可以手动 F5 去看特征


这个是典型的常数值:0x61C88647、0xC6EF3720:典型的 TEA 算法特征


5F4 这个函数是递归,根据输入来处理地图中的迷宫的


可以看到这里的 sub_798 是 sub_5F4 的上层函数
根据 sub_798 的逻辑


第 16 行的 sub_5F4 的 if 语句需要成立
需要执行 sub_988C 函数,然后就双击不进去了,就很艰难

所以,我们换一种思路,从QEMU源码的角度来分析,QEMU是把该二进制文件rebase到了哪里呢?
[Asm] 纯文本查看 复制代码
https://github.com/qemu/qemu
[url=https://github.com/qemu/qemu/tree/master/hw/arm]https://github.com/qemu/qemu/tree/master/hw/arm[/url]
[url=https://github.com/qemu/qemu/blob/master/hw/arm/boot.c]https://github.com/qemu/qemu/blob/master/hw/arm/boot.c[/url]
[url=https://github.com/qemu/qemu/blob/master/hw/arm/vexpress.c]https://github.com/qemu/qemu/blob/master/hw/arm/vexpress.c[/url]


[Asm] 纯文本查看 复制代码
qemu 中对于 arm 架构的 boot 启动方式

[url=https://github.com/qemu/qemu/blob/master/hw/arm/boot.c]https://github.com/qemu/qemu/blob/master/hw/arm/boot.c[/url]
Line 1079: /* 32-bit ARM */
entry = info->loader_start + KERNEL_LOAD_ADDR;
Line 35: #define KERNEL_LOAD_ADDR 0x00010000

[url=https://github.com/qemu/qemu/blob/master/hw/arm/vexpress.c]https://github.com/qemu/qemu/blob/master/hw/arm/vexpress.c[/url]
Line 339:
static VEDBoardInfo a9_daughterboard = {
    ……
    .loader_start = 0x60000000,
    ……
};

entry = 0x60010000


当没有 entry 的时候,IDA 里的字符串没有交叉引用的


设置 entry






顺着这个流程图,明显就能找到题中的 main 了



length = 0x28 = 40

长度不够,后续添加字符 'a',加上之前的 TEA 算法,就很容易搞明白程序的流程和逻辑了
该函数为输入flag后的程序函数,其首先会对输入的flag进行分组,每组两个int一共5组。
对key进行分组,每组4个int,一共3组。并对flag做5次tea加密。
[C++] 纯文本查看 复制代码
#include <bits/stdc++.h>
using namespace std;

#define UINT unsigned int
#define DELTA 0x9e3779b9

void tea_decrypt(UINT* v, UINT* key) {
    UINT l = v[0], r = v[1], sum = 0;
    sum = DELTA * 32;
    for (size_t i = 0; i < 32; i++) {
        r -= (((l << 4) ^ (l >> 5)) + l) ^ (sum + key[(sum >> 11) & 3]);
        sum -= DELTA;
        l -= (((r << 4) ^ (r >> 5)) + r) ^ (sum + key[sum & 3]);
    }
    v[0] = l;
    v[1] = r;
}

UINT str2int(char* str){
    UINT ret = 0;
    for (int i = 0; i < 4; i++)
        ret += pow(0x100, i) * str[i];
    return ret;
}

void int2str(int num, char* str1){
    char ch;
    for (int i = 0; i < 4; i++)    {
        ch = num & 0xff;
        num = num >> 8;
        str1[i] = ch;
    }
    return;
}

int main(){
    char flag[100] = { 0 }, key[] = "dddwwawwwwaasdsasawawdwaaasawassssdwdsddssasddwa";
    UINT keys[12], tea_cry[2], tea_key[4], cry[] = {3179062266, 2936962595, 3754839610, 2425968462, 1458506693, 3303317055, 1294083110, 1674144741, 1029754371, 3863932833};
    for (int i = 0; i < 12; i++){
        char newkey[4] = { 0 };
        memcpy(newkey, key + i * 4, 4);
        keys[i] = str2int(newkey);
    }
    for (int i = 0; i < 5; i++){
        tea_cry[0] = cry[i * 2], tea_cry[1] = cry[i * 2 + 1];
        for (int j = 0; j < 4; j++)
            tea_key[j] = keys[(i * 4 + j) % 12];
        tea_decrypt(tea_cry, tea_key);
        cry[i * 2] = tea_cry[0], cry[i * 2 + 1] = tea_cry[1];
    }
    for (int i = 0; i < 10; i++)
        cout << "0x" << hex << cry[i]<< " ";
    cout << endl;
    for (int i = 0; i < 10; i++)
        int2str(cry[i], flag + i * 4);
    cout << flag << endl;
    return 0;
}


结果为:
flag{932b424a9-9fe2-42d51-9403e-601db1baa5678}

图片.png (14.59 KB, 下载次数: 1)

图片.png

图片.png (59.97 KB, 下载次数: 2)

图片.png

免费评分

参与人数 12威望 +2 吾爱币 +112 热心值 +11 收起 理由
gaosld + 1 + 1 谢谢@Thanks!
10JQKA + 1 谢谢@Thanks!
HUAJIEN + 1 + 1 谢谢@Thanks!
哇卡s + 1 + 1 我很赞同!
KenMaster1 + 1 + 1 谢谢@Thanks!
努力加载中 + 1 + 1 热心回复!
lqwer123456 + 1 + 1 热心回复!
ddddhm + 1 + 1 热心回复!
fengbolee + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
OYyunshen + 1 + 1 谢谢@Thanks!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zzage + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

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

推荐
Hmily 发表于 2022-9-8 10:32
dreamingctf 发表于 2022-9-8 08:24
确认过了,问题不大,可以读得懂

要是多余可以直接删除,要是丢了就编辑插入吧,完美一些。
推荐
 楼主| dreamingctf 发表于 2022-9-8 08:24 |楼主
Hmily 发表于 2022-9-7 16:36
@dreamingctf 有2个图好像插入丢了?

确认过了,问题不大,可以读得懂

点评

要是多余可以直接删除,要是丢了就编辑插入吧,完美一些。  详情 回复 发表于 2022-9-8 10:32
沙发
Hmily 发表于 2022-9-7 16:36
3#
maybegood 发表于 2022-9-7 22:33
大佬有时间其他的题也分享学习一下呀
5#
syx9527 发表于 2022-9-8 09:23
你给我们搞的这个东西啊 可以说是excited
6#
syx9527 发表于 2022-9-8 09:25

newbee 你给我们搞的这个东西啊 可以说是excited
8#
rinima 发表于 2022-9-8 17:59
感谢楼主分享
9#
eddiechen 发表于 2022-9-9 13:13
谢谢分享,大神代码分享真强
10#
rinima 发表于 2022-9-9 18:35
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

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

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

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

GMT+8, 2022-9-26 10:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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