zeromovie 发表于 2018-4-5 22:04

一道北邮面向全国高中生自主招生ctf的re题

本帖最后由 zeromovie 于 2018-4-7 13:03 编辑

实在是不会解一堆v变量,应该如何一步步转换伪c代码?

统一回复:这是题目已经过去好久了才发的题目。主要是分享题目和思路,而不是求代答。分析第二页就有,应该是没违规吧?全部看完再喷也不迟

现在的问题是我ida的f5代码和所谓的rc4真的对应不上,尤其是字符数组的指针那里,感觉不懂这个加密算法的几乎无法解题。

1364847132 发表于 2018-4-6 04:40

本帖最后由 1364847132 于 2018-4-6 05:54 编辑

#include<iostream>
#include<string>
using namespace std;
char a;
string equ="7C553E5F0EB4CCB977BF6BD960E0B968FB11CED2154B0EB5F73E51EE514D5A9C01A0C53AD038";
void init(char *s)
{
    char s2;
    for(int i=0;i<256;i++)
    {
      a=i;
      s2=s;
    }

    int add=0;
    for(int i=0;i<256;i++)
    {
      int tmp=a;
      add=(a+s2+add)%256;
      a=a;
      a=tmp;
    }
}
string start(string a2)
{
    char s[]="SimpleCryptography";
    init(s);
    int add=0;
    char ques;
    char *pri=ques;
    for(int i=0,j=1;i<a2.size();i++,j=(j+1)%256)
    {
      unsigned int temp=a;
      add=(a+add)%256;
      add=add & 0xff;
      a=a;
      a=temp;

      unsigned int temp2=(a[((a+a)%256) & 0xff]^a2) &0xff;

      a2=temp2;
      sprintf(pri,"%02X",temp2);
      pri+=2;
    }
    return string(ques);
}
int main()
{
    string ans="";
    for(int j=0;j<38;j++)
    {
      for(int i=1;i<256;i++)
      {
            string temp=ans+(char)i;
            if(string(equ,0,2*(j+1))==start(temp))
            {
                ans=temp;
                break;
            }
      }
    }
    cout<<ans;
    return 0;
}


跑出来的flag是

BUPT{rc4_Cryptography_1sSOEa5y!-_-!!!}

{:301_1009:}{:301_1009:}{:301_1009:}{:301_1009:}

zeromovie 发表于 2018-4-6 11:43

转载自看雪 ID:pandaos(无名侠)的解题文档Re2
这道题目也比较简单,比第一题还简单一点,题目用的是 RC4 加密。
RC4 算法如下:
void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len)
{
int i = 0, j = 0;
char k = { 0 };
unsigned char tmp = 0;
for (i = 0; i < 256; i++) {
s = i;
k = key;
}
for (i = 0; i < 256; i++) {
j = (j + s + k) % 256;
tmp = s;
s = s;//交换 s和 s
s = tmp;
}
}
void rc4_crypt(unsigned char*s, unsigned char*Data, unsigned long Len)
{
int i = 0, j = 0, t = 0;
unsigned long k = 0;
unsigned char tmp;
for (k = 0; k < Len; k++)
{
i = (i + 1) % 256;
j = (j + s) % 256;
tmp = s;
s = s;//交换 s和 s
s = tmp;
t = (s + s) % 256;
Data ^= s;
}
}
代码刚好可以和 401100、4011B0 处的代码吻合,先用肉眼检测是否被魔改,再带观察数据,
最终可下结论,题目采用的是标准 RC4 算法。
很容易找到密文数据:
7C553E5F0EB4CCB977BF6BD960E0B968FB11CED2154B0EB5F73E51EE514D5A9C01A0C53AD038
可以在 401100 处下断得到密钥:
SimpleCryptography
最后编写程序得到 flag:
void main () {
unsigned char s = { 0 };
unsigned char dst[] =
{ 0x7C,0x55,0x3E,0x5F,0x0E,0xB4,0xCC,0xB9,0x77,0xBF,0x6B,0xD9,0x60,0xE0,0xB9,0x68,0xFB,
0x11,0xCE,0xD2,0x15,0x4B,0x0E,0xB5,0xF7,0x3E,0x51,0xEE,0x51,0x4D,0x5A,0x9C,0x01,0xA0,0x
C5,0x3A,0xD0,0x38 };
char * key = "SimpleCryptography";
rc4_init(s, (unsigned char *)key, strlen (key));
rc4_crypt(s, dst, sizeof(dst));
printf(dst);
}
感想 :rc4 算法的解密代码和加密过程也一样,找出密文和密钥是解题的最快方法。这道
题有三点启示。
第一,二进制安全需要熟练掌握各种基本算法的流程以及原理,对算法的关键常量要敏感。
第二,对于一个未知加密算法,可通过代入密文数据测试是否可逆。
第三,对于一个未知加密算法,如果没有提供加密或解密代码,则需要根据逆向并编程实现
另外一半函数,最简单的方法是 angr 符号执行或利用 z3 进行约束求解。

kilkilo502 发表于 2018-4-5 22:35

什么叫RE

冰露㊣神 发表于 2018-4-5 22:45

kilkilo502 发表于 2018-4-5 22:35
什么叫RE

reverse me,还原题目,求算法

都同学 发表于 2018-4-5 22:46

IDA F5呀

玩机小白丶王 发表于 2018-4-5 22:46

北邮怎么又把变异GKOD壳发出来了?某安论坛不是早发出教程来了?

btctw 发表于 2018-4-5 23:41

不明觉厉

萌神淼菥 发表于 2018-4-6 00:13

隨風而飄 发表于 2018-4-6 00:13

台灣高中生路過支持,雖然不明覺厲,但是依然熱愛學習,熱愛編程

菊花朝墙 发表于 2018-4-6 00:35

隨風而飄 发表于 2018-4-6 00:13
台灣高中生路過支持,雖然不明覺厲,但是依然熱愛學習,熱愛編程

有兴趣是好事,保持!
页: [1] 2 3
查看完整版本: 一道北邮面向全国高中生自主招生ctf的re题