简单逆向题出题与逆向
2018-03-06 本文已影响77人
Killshadow
SimpleRev
题目下载连接: https://pan.baidu.com/s/1jmWZTnqJyY2UsTTbBfD34Q 密码: kzi7
- 一开始现在Linux下用
file
命令看看是什么文件:
- 然后执行一下程序, 一看究竟, 发现执行不了
Segmentation fault (core dumped)
段错误:
- 用IDA打开, 从程序初始化开始, 在_init_proc中出现了
sp-analysis failed
的错误, 通过对比两个rsp可知, 是因为函数开头的rsp被修改了:
-
patch之后, 能正常运行:
-
可以大致猜测, 这是一道分析算法的逆向题:
-
再回到IDA,看看特征函数:
- 通过下面反汇编内容,就已经可以看出key和text分别是
ADSFKSLCDN
和killshadow
:
-
再看看函数逻辑:
可以看到,首先是对key操作,然后是跟text比较:
- 写出解密算法即可解出flag:
void Encry()
{
char key[100];
char ch,temp;
int L,i=0,j=0;int t;
if(getchar()=='\n')
temp=' ';
printf("Input key: ");
fgets(key,100,stdin);
L=strlen(key);
for(t=0;t<L;t++)
{
if (key[j%L] >= 'A'&&key[j%L] <= 'Z' || key[j%L] >= 'a'&&key[j%L] <= 'z')
{
key[t] = key[j%L] + 32;
}
else if(key[j%L] >= ' ' && key[j%L] <= '@')
{
key[t] = key[j%L] + 32;
}
j++;
}
while((ch=getchar())!='\n')
{
if(ch==' ')
{
i++;
continue;
}
if(ch>='a'&&ch<='z')
{
str1[i] = (ch - 'a' + key[j%L] - 'a') % 26 + 'A';
printf("%c",str1[i]);
j++;
}
if(ch>='A'&&ch<='Z')
{
str1[i] = (ch - 'a' + key[j%L] - 'a') % 26 + 'A';
printf("%c", str1[i]);
j++;
}
if (ch >= ' '&& ch <= '@')
{
str1[i] = (ch - 'a' + key[j%L] - 'a') % 26 + 'A';
printf("%c", str1[i]);
j++;
}
if(j%L==0)
printf(" ");
i++;
}
putchar(ch);
}
- 最后解得flag为:
KLDQCUDFZO