NKCTF-2023-RE-Baby_rust

Baby_rust

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

查找字符串
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

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

在这里插入图片描述

在这里插入图片描述

我们可以发现这里有一大长串的程序块
在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

另一种就是手撕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

在这里插入图片描述

可以知道,我们对于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 }

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值