9.5 BUUCTF SimpleReverse
用IDA打开反编译后遇到一些疑点:
首先 v9 src 这些都是以16进制整数表示的 而我们想要的肯定是字符串
直接选择按 R 转换成字符串
这里有一个关于 小端序大端序的考点:
在 X86CPU中 字符串是按小端序存储的 而IDA采用的是大端序 所以我们要将得到的字符串反转一下
然后接下来就是分析代码 逆向求flag了
这段是将 大写转换成小写
while ( 1 )
{
v1 = getchar();
if ( v1 == 10 )
break;
if ( v1 == 32 )
{
++v2;
}
else
{
if ( v1 <= 96 || v1 > 122 )
{
if ( v1 > 64 && v1 <= 90 )
{
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
++v3;
}
}
else
{
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
++v3;
}
if ( !(v3 % v5) )
putchar(32);
++v2;
}
}
这段代码是关键
首先有个点要注意到 v3在前面的大写转小写的操纵中已经累加为 v3=10了
然后我们用C++ 按照代码原来的逻辑逆向:
#include<bits/stdc++.h>
using namespace std;
signed main(){
string str2="killshadow";
string key="adsfkndcls";
string flag="";
int v5=10;
int v3=10;
int v2=0;
for(int i=0;i<v5;i++){
for(int j=0;j<123;j++){
if(!((j>='A'&&j<='Z')||(j>='a'&&j<='z'))){
continue;
}
int v1=j;
if(str2[i]==(v1-39-(int)key[v3%v5]+97)%26+97){
flag+=(char)v1;
v3++;
break;
}
}
}
cout<<flag;
}
这里不需要想巧妙方法一步得到v1 直接暴力循环枚举更简洁
最后得到flag{KLDQCUDFZO}