下載得到一個exe程序,是32位的
大概程序邏輯就是我們輸入正確的flag,就會提示正確。
1.字符串搜索大法SHift+F12,但是根據題目說NoString可能我們搜索不到
2.因為我們搜索不到字符串,所以我們考慮是被加密了,需要分析代碼
3.使用IDA打開程序進行反編譯,查看main函數,分析代碼獲取邏輯:
int wmain()
{
signed int v0; // ecx //定義的一些變量
signed int i; // eax
signed int v2; // ecx
signed int j; // eax
int k; // eax
int v5; // eax
signed int v6; // ecx
signed int l; // eax
signed int v8; // ecx
signed int m; // eax
char v11; // [esp+0h] [ebp-18h] BYREF
__int128 v12; // [esp+1h] [ebp-17h]
__int16 v13; // [esp+11h] [ebp-7h]
v0 = strlen(Format); //計算字符串 Format 的長度
for ( i = 0; i < v0; ++i )
Format[i] ^= 9u; //a=a^9u 按位異或並賦值,這可能是加密操作
printf("yelhzl)`gy|})|)oehnl3"); //可能是加密的輸出,推測很有可能是開頭讓我們輸入flage的提示
v11 = 0;
v13 = 0;
v12 = 0i64;
v2 = strlen(a80z); //計算字符串 a80z 的長度
for ( j = 0; j < v2; ++j )
a80z[j] ^= 9u; //加密操作安位異或
scanf(a80z, &v11); //讀取用戶輸入數據, &v11代表用戶輸入數據,a80z代表獲得用戶輸入的變量
for ( k = 0; k < 19; ++k )
*(&v11 + k) ^= 9u;
v5 = strcmp(&v11, aOehnl3rHfCcgpt); //比較兩個字符串的大小,用戶輸入是否長度大於aOehnl3rHfCcgpt
if ( v5 )
v5 = v5 < 0 ? -1 : 1; //v5小於0的話就是-1,否則就是1
if ( v5 ) //v5為1所執行的代碼
{
v6 = strlen(aLF);
for ( l = 0; l < v6; ++l )
aLF[l] ^= 9u;
printf("l{{f{");
}
else //v5為-1執行的代碼
{
v8 = strlen(aNa);
for ( m = 0; m < v8; ++m )
aNa[m] ^= 9u;
printf("{`na}");
}
printf("\r\n");
system("pause");
return 0;
}
根據上面的代碼分析,xx經過9u異或操作,得到了printf的內容
4.我們需要知道異或(^)操作
舉例:11001001^00110001=11111000
10=1;01=1;11=0;00=0
當我們得到11111000和00110001,我們怎么得到11001001?當然也是異或
11111000^00110001=11001001
5.我們可以試着寫出解密腳本:
#include<stdio.h>
#include <string.h>
int main(){
char a[] = "l{{f{";
int len = strlen(a);
for(int i = 0;i < len ; i++) //按位異或
{
a[i] ^= 9u;
}
printf("%s",a);
}
此時提交的flag的是錯誤的,看看我們遺漏了什么