一道北邮面向全国高中生自主招生ctf的re题
本帖最后由 zeromovie 于 2018-4-7 13:03 编辑实在是不会解一堆v变量,应该如何一步步转换伪c代码?
统一回复:这是题目已经过去好久了才发的题目。主要是分享题目和思路,而不是求代答。分析第二页就有,应该是没违规吧?全部看完再喷也不迟
现在的问题是我ida的f5代码和所谓的rc4真的对应不上,尤其是字符数组的指针那里,感觉不懂这个加密算法的几乎无法解题。 本帖最后由 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:}
转载自看雪 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 进行约束求解。 什么叫RE kilkilo502 发表于 2018-4-5 22:35
什么叫RE
reverse me,还原题目,求算法 IDA F5呀 北邮怎么又把变异GKOD壳发出来了?某安论坛不是早发出教程来了? 不明觉厉 台灣高中生路過支持,雖然不明覺厲,但是依然熱愛學習,熱愛編程 隨風而飄 发表于 2018-4-6 00:13
台灣高中生路過支持,雖然不明覺厲,但是依然熱愛學習,熱愛編程
有兴趣是好事,保持!