BUUCTF-REVERCE-[2019红帽杯]easyRE
[2019红帽杯]easyRE
偶尔还是得花时间在难题上面啊。虽然很麻烦,但吃透之后真的是受益匪浅,比狂刷简单题有效多了。
1.破解1
一般而言,寻找非随机数会是比较快捷的方式。典型的就是子串。
在这里可以看到0X4A26C0有一串典型的base64编码,0X4A2348应该就是base加密后的子串。
(结合题目easyre,当时以为里面就是flag)
解密后是一个网址
https://bbs.pediy.com/thread-254172.htm
帖子本身非常经典,学逆向的其实都该去看看。
内容简单来说,就是教你做程序的时候怎样设套,让破解者陷入泥淖。或者说,当我们找到这网址的时候,就已经掉陷阱里面了……
话虽如此,因为缺少符号表,所有的函数都没有名字,一个个用手去翻实在太慢了。所以,唯一的线索仍然是那些子串。
2.交叉引用,找到加密函数(?)
这个地方最先引起了我的注意,“you found me!”真的很像flag会出现的地方,想必大部分师傅们最开始也会从这个地方先入手。但是0x6cc090中的字符串其实就是那一串bese64……
因为以已经踩过坑了,所以不到万不得已我是不会去破解这个地方的(况且那个0x400e44函数真的很恐怖)。正好,在这之前还有一段加密程序,其和base64的解密没有任何关联,子串也非常不起眼,可以尝试破解一下。
在破解之前,补充一点小知识:
- memset的后面一般都会跟上scanf或者read函数
- 有些时候连续创建的几个数组可能是同一个数组。可以通过查看地址进行核验。
这里v12的数组大小是13,而v14和它的距离也正好是13,说明它们的地址是连在一起的,v14同理。也就是说得到了v12的基地址,也就可以控制v12/13/14。至于那个127,在子串中可以表示为分隔符,但在这个地方直接写作”\x7F”就行了。
3.破解2
根据上述知识,先美化一下代码,看得更清楚一点。
加密就是最简单的异或,所以照模照样写就行了。
结果:flag的最前面四个字符是"flag"
好吧,说白了就是又被坑了。但并不是没有收获,其本身或许也可以是一个线索?
4.找下一条线索
这个时候是真没办法了,只能到处乱逛看看有什么漏洞。翻了附近了几个函数,结果发现这么一个函数。
第20行的代码,将两个子串(?)和f、g进行了比对,这和我们之前拿到的“flag”这个线索有所贴合。
于是开始进行分析:
1.前18行代码说白了就是对v1进行加密,而且因为密文是随机生成的,所以光凭这段代码是无法进行破解的。
2.需要注意的是,v1在定义时虽然是int类型,但其大小达到了4字节。并且v1==v4
3.第20行代码中,HIBYTE()的意思其实是取最高位的字节,也就是第四个字节。这和"g"在flag"的位置是相吻合的。
然后查看0X6CC0A3
按A转换成子串
长度和正好是25,可以确定是该函数的密文。然后key就是v1(v4),其可以通过和“flag”异或进行还原。
到这里,所有信息都收集完毕,可以着手下一次破解了。
5.破解3
加密方式是用v4循环地对密文逐位进行异或加密。所以解密也很简单,用"flag"解出v4,然后对密文异或就好了。
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<unistd.h>
#include<fstream>
using namespace std;
int main(){
string a = "Iodl>Qnb(ocy\x7Fy.i\x7F";
a += "d`3w}wek9{iy=~yL@EC";
for(short int i = 0; i < a.length(); i ++){
cout << char(int(a[i]) ^ i);
}
char flag[] = {0x40,0x35,0x20,0x56,0x5D,0X18,0X22,0X45,0X17,0X2F,0X24,0X6E,0X62,0X3C,0X27,0X54,0X48,0X6C,0X24,0X6E,0X72,0X3C,0X32,0X45,0x5B};
char key[4];
key[0] = 'f' ^ flag[0];
key[1] = 'l' ^ flag[1];
key[2] = 'a' ^ flag[2];
key[3] = 'g' ^ flag[3];
cout << endl;
for (short j = 0; j <= 24; ++j )
cout << char(flag[j] ^ key[j % 4]);
}
flag{Act1ve_Defen5e_Test}
总结
掉进坑里,爬出来,掉进另一个坑里……其实这道题很符合我最初对逆向的想象,一点点收集线索,一步步逼近真相。最后看到flag跳出来的时候真的是非常高兴,可以说是切实感受到了逆向的魅力。