吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2177|回复: 21
上一主题 下一主题
收起左侧

[CTF] DASCTF-2024暑期赛-Reverse-WP

  [复制链接]
跳转到指定楼层
楼主
落尘大大和你呢 发表于 2024-7-21 13:37 回帖奖励
本帖最后由 落尘大大和你呢 于 2024-7-21 13:44 编辑

REVERSE

DosSnake_e


程序运行后发现是个贪吃蛇,可以猜测到应该是到达某个分数后会出现信息提示,IDA打开分析


通过字符串定位快速找到关键代码,这段代码就是flag的地方了
取aDasctf+6开始处的字符与aDasctf进行异或,直到aDasctf+6字符串全部处理完毕,看下这两处的字符


DASCTF是第一处,下面的是DASCTF+6处,循环异或DASCTF,脚本解密

#include<iostream>

unsigned char byte_10324[6] = {
0x44, 0x41, 0x53, 0x43, 0x54, 0x46
};

unsigned char data[31] = {
0x3F, 0x09, 0x63, 0x34, 0x32, 0x13, 0x2A, 0x2F, 0x2A, 0x37, 0x3C,
0x23, 0x00, 0x2E, 0x20, 0x10, 0x3A, 0x27, 0x2F, 0x24, 0x3A, 0x30, 0x75, 0x67, 0x65, 0x3C
};

unsigned char flag[31] = { 0 };
int main()
{
    for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++)
        {
            flag[i] = data[i] ^ byte_10324[i % 6];
            printf("%c", flag[i]);
        }
}

PS:其实还可以直接修改程序判断逻辑直接输出FLAG,


cmp改为cx,cx


修改cmp改为ax,ax。
运行程序输出flag:

Strangeprograme

PE32文件,直接IDA+OD分析


通过字符串快速定位到主函数,逻辑清晰直接查看 aDasctfIAmFakeB 的值


显然,假的flag,尝试输入这个字符串看程序输出结果:


显然,程序 hook 了 j_memcmp函数,这个函数其实就是 memcmp,比较字符串,如果相同则返回0.
0取反后为1,此时程序应该输出“Right”但程序输出了“Wrong”!,所以可以猜到大概率是hook了这个函数。如果直接在IDA中调试的话我没有找到hook的入口,我是在OD中分析的


通过字符串快速定位到主要函数:
PS:调式的时候要输入长度为40的字符串,后面会说为什么是40。


call 004115AA显然是输入函数了,输入后字符串保存到了0x422580地址中,0x422000保存的是那个假的flag。
接着进入 00411122 函数,这个函数就是 memcmp,跟进分析


经过几层跳转后可以发现最终是去到了用户函数,由此更加确定是 hook 了这个比较函数。
跟进分析:
0x0041D250到0x0041D282行不用分析,用不到的,0x0041D283到0x0041D39B是局部变量赋值,有40个。


第一个主要代码块,0x0041D3E4 判断了输入字符串长度,如果不是40,那么eax赋值1后跳到 0x0041D59B,这里就是函数结束代码了。
4个字节为一组取前8个字节作为数据进行TEA加密,密钥存储在 0x422100 地址处:


把第一次TEA加密的结果存储到0x422580,0x0041D4CE处又对前两个数据块进行了TEA加密,所以前两个数据块加密了两次后存储到 0x0041D59B 处。接着来到了关键代码块:


这一堆代码干的事其实就是个:异或。
解释:取3,4数据块对1,2数据块进行异或后存储,异或完后继续对1,2数据块进行TEA加密,接着5,6数据块在对1,2数据块进行异或后存储,异或完后继续对1,2数据块进行TEA加密,接着7,8数据块对1,2数据块进行异或后存储,异或完成后在对1,2数据块加密,在对9,10数据块对1,2数据块进行异或后存储。
总体来说,这堆代码就干了些操作。注意:第一次的1,2数据块是TEA加密两次后的数据。
跟进TEA加密分析一下


TEA加密代码是直接在用户模块中的,在IDA中可以反汇编,在OD中复制TEA函数的首地址,IDA调试起来让 memcmp 函数执行后跳转到 TEA地址处,此时是一堆数据,需要按C识别为函数


刚好也看到密文了,这个在OD中也有,只是OD中不好提取出来。


TEA函数,跟进后反汇编查看


就魔改了轮次,标准的是32轮,这里是16轮。
这样就差不多分析完了,直接搓代码解密

#include<stdio.h>
#include<stdint.h>
#include<string.h>

//解密函数
void decrypt_tea(uint32_t* v, uint32_t* k) {
    uint32_t v0 = v[0], v1 = v[1], sum = 16 * 0x9e3779b9, i;     /* set up */
    uint32_t delta = 0x9e3779b9;                            /* a key schedule constant */
    uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];    /* cache key */
    for (i = 0; i < 16; i++) {
        sum -= delta;
        v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
        v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
    }                                                           /* end cycle */
    v[0] = v0; v[1] = v1;
}

int main()
{
    int k = 6, s = 7;
    uint32_t key[5] = { 0x12345678, 0x09101112, 0x13141516, 0x15161718 };
    uint32_t data[] = {
                    0xBC2B4DF9,
                    0x6213DD13,

                    0x89FFFCC9,
                    0x0FC94F7D,

                    0x526D1D63,
                    0xE341FD50,

                    0x97287633,
                    0x6BF93638,

                    0x83143990,
                    0x1F2CE22C
    };
    data[8] ^= data[0];
    data[9] ^= data[1];

    //  求出data[0],data[1]解密5次的数据;
    for (int i = 0; i < 5; ++i)
    {
        decrypt_tea(data, key);
        if (i == 0)
        {
            data[6] ^= data[0];
            data[7] ^= data[1];
        }
        else if (i == 1)
        {
            data[4] ^= data[0];
            data[5] ^= data[1];
        }
        else if (i == 2) {
            data[2] ^= data[0];
            data[3] ^= data[1];
        }
        //printf("%#x %#x\n", data[0], data[1]);
    }

    printf("----------------------------------------\n");

    for (int i = 0; i < 10; i++) {
        printf("%c%c%c%c", *((char*)&data[i] + 0), *((char*)&data[i] + 1), *((char*)&data[i] + 2), *((char*)&data[i] + 3));
    }
}

flag:DASCTF{I4TH0ok_I5S0ooFunny_Isnotit?????}
PS:代码水平有限,望理解。

免费评分

参与人数 12威望 +1 吾爱币 +25 热心值 +12 收起 理由
helian147 + 1 + 1 热心回复!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wobuaipojie7 + 1 我很赞同!
1783780690 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
pales1gh + 1 我很赞同!
Zhouyipeng + 1 + 1 谢谢@Thanks!
Issacclark1 + 1 谢谢@Thanks!
boybubble + 1 + 1 666666
xfsan + 1 + 1 鼓励转贴优秀软件安全工具和文档!
Xiaf + 1 我很赞同!
d3do + 1 我很赞同!
vmoranv + 1 我很赞同!

查看全部评分

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

推荐
jmdyy 发表于 2024-7-22 17:09
一般直接偷懒动态调试输出,这个xor写的比较明显,事后才看出来
推荐
wudalang123 发表于 2024-7-23 07:26
在你提供的C++脚本中,异或解密过程似乎依赖于固定长度的密钥和数据数组。如果遇到可变长度的密钥或数据,你会如何调整解密策略?
沙发
xianshi789 发表于 2024-7-21 16:40
3#
RhineLT 发表于 2024-7-21 19:53
大佬厉害
4#
ludonghengsb 发表于 2024-7-22 00:18
感谢楼主分享!
5#
liulanx 发表于 2024-7-22 10:30
牛牛牛不错啊哈哈哈不错不错
6#
jmllz 发表于 2024-7-22 12:46
感谢楼主分享
7#
pales1gh 发表于 2024-7-22 13:29
感谢楼主分享
8#
QAQ233YYDS 发表于 2024-7-22 14:25
谢谢大佬的教程
9#
irework 发表于 2024-7-22 15:59
顶一波顶一波
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-14 11:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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