逆向呢真的是一边学一边写题过来的,我比较喜欢这样
贴上题目https://pan.baidu.com/s/1KDQs81aqUYl7T7E9mZO-SQ

C plus plus

拖到IDA里面看一看,发现main函数里面有两个特别重要的加密函数,点击进去看看
因为正在学c++所以呢,就去把basic_ string这个类去看了一下(真的是萌新要学习的东西很多呢)

贴上学习的地址,个人更偏向英文版,英文版:http://www.cplusplus.com/reference/string/basic_string/basic_string/
中文版:https://blog.csdn.net/hl156/article/details/80610597

basic_ string(char &s1,char &s2)是把s2字符串赋值给s2;若是basic_string(char &s1,int n)是打印出s1前n个字符,以字符串的形式;basic _string(char &s1,int n,int m)若n<m是打印出s[n]到s[m]之间的字符串,若n>m是打印出s[n]后面m个字符(都包括s[n]);basic _string(int n,’a’)是打印n个a出来,等等….
~basic_string()则是删除这个字符串
operate就是取字符串第i位的字符出来
c-str()返回指向数组的指针,该数组包含表示basic _string对象当前值的以空字符结尾的字符序列(即C字符串)。即此数组包含构成basic _string对象的值的相同字符序列以及末尾的附加终止空字符(charT())。下面代码助于理解,其中strtok这个函数下面是他的固定格


好了,好了废话太多了

以下是第一个加密函数
经过调试无论如何都会通过第一加密函数的,第一个是简单的异或与位移所以算法就是左移数组六位|右移数组两位再按位异或

第二个加密函数就比较复杂
我调试了之后大概意思是跟前面一个异或

下面是我的脚本,参考了大佬(Mr.Riscker)的代码的,觉得很简洁

当当当,flag如下

偶然在吾爱论坛上找到了一个讲解及其细致的wp,很适合我这种新人看啊贴上地址https://www.52pojie.cn/thread-819393-1-1.html

里面讲到了之前我没有注意到的几点,我重新加上:

  1. a<<2这个从哪里来:在ida上面第一个函数中有v2 = 4 * *(char *)std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::operator[](a1, i);这个并不是讲a1*4而是在进行”a<<2”的操作
  2. 代码中的&0xff:第一个加密函数进行了a[i]=(a[i]<<2|a[i]>>6)^i这样的一个操作,但是异或i这一步跑不出来,所以还要加上&0xff才行,byte类型的数字要&0xff再赋值给int类型,是想保持二进制补码的一致性(数据在计算机中存储是以二进制的方式,正数存储的二进制原码,负数存储的是二进制的补码,补码是负数的绝对值反码加1)