NoString --- bugku


下載得到一個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的是錯誤的,看看我們遺漏了什么




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM