吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5919|回复: 28
收起左侧

[CTF] CISCN CTF rthread.bin 逆向题

  [复制链接]
dreamingctf 发表于 2022-9-7 14:58
本帖最后由 dreamingctf 于 2022-10-12 09:09 编辑

CISCN - rtthread是一个非常新颖的好题
题目中给的是一个 sh 文件和一个类似固件的bin rtthread.bin
图片.png

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

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

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

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

如果瞎输入的话,就是会报错的
图片.png

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

输入的字符串为:
dddwwawwwwaasdsasawawdwaaasawassssdwdsddssasddw
图片.png

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


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


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


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

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

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

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


[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
qemu 中对于 arm 架构的 boot 启动方式
 
https://github.com/qemu/qemu/blob/master/hw/arm/boot.c
Line 1079: /* 32-bit ARM */
entry = info->loader_start + KERNEL_LOAD_ADDR;
Line 35: #define KERNEL_LOAD_ADDR 0x00010000
 
https://github.com/qemu/qemu/blob/master/hw/arm/vexpress.c
Line 339:
static VEDBoardInfo a9_daughterboard = {
    ……
    .loader_start = 0x60000000,
    ……
};
 
entry = 0x60010000


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

设置 entry
图片.png
图片.png
图片.png
图片.png
图片.png
顺着这个流程图,明显就能找到题中的 main 了
图片.png
图片.png
length = 0x28 = 40

长度不够,后续添加字符 'a',加上之前的 TEA 算法,就很容易搞明白程序的流程和逻辑了
该函数为输入flag后的程序函数,其首先会对输入的flag进行分组,每组两个int一共5组。
对key进行分组,每组4个int,一共3组。并对flag做5次tea加密。
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#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}

rthread.zip

192.63 KB, 下载次数: 6, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 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-10-12 08:56
dreamingctf 发表于 2022-10-11 15:53
请问下管理员,我应该是上传了附件的,后面的楼层有小伙伴问,我自己也从链接里找不到了哎,3Q~

是不是传错了,只有2个没有插入文章的图片,重新传一下?顺便把多的图片处理一下。
 楼主| dreamingctf 发表于 2022-10-11 15:53
Hmily 发表于 2022-9-8 10:32
要是多余可以直接删除,要是丢了就编辑插入吧,完美一些。

请问下管理员,我应该是上传了附件的,后面的楼层有小伙伴问,我自己也从链接里找不到了哎,3Q~

点评

是不是传错了,只有2个没有插入文章的图片,重新传一下?顺便把多的图片处理一下。  详情 回复 发表于 2022-10-12 08:56
Hmily 发表于 2022-9-7 16:36
maybegood 发表于 2022-9-7 22:33
大佬有时间其他的题也分享学习一下呀
 楼主| dreamingctf 发表于 2022-9-8 08:24
Hmily 发表于 2022-9-7 16:36
@dreamingctf 有2个图好像插入丢了?

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

点评

要是多余可以直接删除,要是丢了就编辑插入吧,完美一些。  详情 回复 发表于 2022-9-8 10:32
syx9527 发表于 2022-9-8 09:23
你给我们搞的这个东西啊 可以说是excited
syx9527 发表于 2022-9-8 09:25

newbee 你给我们搞的这个东西啊 可以说是excited
Hmily 发表于 2022-9-8 10:32
dreamingctf 发表于 2022-9-8 08:24
确认过了,问题不大,可以读得懂

要是多余可以直接删除,要是丢了就编辑插入吧,完美一些。
rinima 发表于 2022-9-8 17:59
感谢楼主分享
eddiechen 发表于 2022-9-9 13:13
谢谢分享,大神代码分享真强
rinima 发表于 2022-9-9 18:35
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-5-20 00:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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