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 }