9.5 BUUCTF SimpleReverse

用IDA打开反编译后遇到一些疑点:
image
首先 v9 src 这些都是以16进制整数表示的 而我们想要的肯定是字符串
直接选择按 R 转换成字符串
image
这里有一个关于 小端序大端序的考点:
在 X86CPU中 字符串是按小端序存储的 而IDA采用的是大端序 所以我们要将得到的字符串反转一下
image
然后接下来就是分析代码 逆向求flag了
image
这段是将 大写转换成小写

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}

posted @ 2023-09-05 20:15  N0zoM1z0  阅读(9)  评论(0编辑  收藏  举报