二木 王者

Baby_rust

打开ida进行分析,打开sting窗口进行分析。

查找字符串

Untitled

Untitled

Untitled

这里应该就是我们的main函数了,进入函数进行分析。

rust语言,说是专注于安全的语言,确实,用ida进行反汇编,根本看不了,所以我们只能对汇编进行分析。

我们可以从这里发现,一串字符串之后,紧跟着的就是调用memcmp函数,我们就可以大致猜出,这里的字符串就是我们的密文。,前面有一条sub-1C(28)指令,为数据开辟28个空间,我们就可以推测出我们flag的长度为28

Untitled

Untitled

我们可以发现这里有一大长串的程序块

Untitled

我们能发现,这些块的结构很相似都是先进行异或0x30然后再加上0xD3,然后后面再cmp1,2,3,4……,这里我们数一下,刚好28块,cmp也比较到了28.

Untitled

这里我们可以知道,这里是对我们的flag进行了单字节加密。

我们进行动态调试可以发现,在对flag单字节加密之前,会先运行到这个块。

Untitled

到这里,有两种方法,一种是进行动态调试,将其当做黑盒分析,输入多组数据,然后总结规律。

另一种就是手撕SSE2汇编代码。

这里我找到了一个大佬写对SSE2汇编得很好的总结,在此放个链接。

(49条消息) SSE2指令集_cvtsi2ss_hksoobe的博客-CSDN博客

通过汇编代码,我们可以分析得出大致逻辑为,判断输入数据是否大于70,若大于70则减40,若小于70则加40.

到此处,我们可以写下我们的解题脚本。

#include <stdio.h>

int main()
{
    int i;
    char data[28] = {
        0x29, 0x26, 0x6E, 0x5F, 0x71, 0x46, 0x62, 0x27, 0x4E, 0x5A, 0x58, 0x70, 0x6A, 0x29, 0x2A, 0x62,
        0x4C, 0x44, 0x6D, 0x4C, 0x6E, 0x56, 0x6A, 0x5D, 0x40, 0x5E, 0x5F, 0x48};

    for (i = 0; i < 28; i++)
    {
        if (data[i] < 70)
        {
            data[i] += 40;
        }
        else
            data[i] -= 40;
        data[i] -= 0xd3;
        data[i] ^= 0X30;
    }
    for (i = 0; i < 28; i++)
        printf("%c ", data[i]);

    return 0;
}

到此次,我们还是不能得出flag

Untitled

可以知道,我们对于Rust逆向出来的加密还是缺失了一些步骤,还有两个字节的数据没有出来。

正所谓,做逆向,十题九猜,这里我们就可以使用我们的猜猜大法,NOWa?BaCK,这里应该是他们的战队名nowayback,为Y或者y。R?ST,这里不出意料就是U,或者u,这样总共四种情况,分别试一下即可。

可得N K C T F { W L c o m E _ N O W a y B a C k _ R u S T }

 评论
目录