世界で攻防が逆BABYRE

BABYRE XCTF第四-WHCTF-2017

 

INT __cdeclメイン(int型 ARGC、CONST  チャー ** ARGV、CONST  チャー ** envpを)
{ 
  チャー S。// [RSP + 0H] [RBP-20H] 
  int型の V5; // [RSP + 18時間] [RBP-8H] 
  int型のI; // [RSP +代一] [RBP-4H] 

  (i = 0 ; iは= < 181 ; ++ I)
  { 
    envpを =(CONST  CHAR **)(*((符号なし__int8 *)裁判官を+ I)^ 0xCu );
    *((_ BYTE *)裁判官+ I)^ = 0xCu 
  }
  printf(" 入力してくださいフラグ:" 、ARGV、envpは); 
  __isoc99_scanf(" %の20S "、&S)。
  V5 =のSTRLEN(&S)。
  もし(V5 == 14 &&(符号なし整数)裁判官((__ int64型)&S))
    プット(" 右!" );
  他の
    プット(" 間違いました!" );
  リターン 0 ; 
}

クリアプログラムの流れ、裁判官の重要なポイントは、プログラムが復号化された最初の裁判官から0xC XORデータから始まり、その関数をコールバック

__int64 __fastcall裁判官を締結(__ int64モードA1)
{ 
  チャー V2。// [RSP + 8H] [RBP-20H] 
  チャー V3。// [RSP + 9H] [RBP-1Fhの] 
  チャー V4。// [RSP +あ] [RBP-1EH] 
  チャー V5。// [RSP + Bhの] [RBP-1Dhで] 
  チャー V6。// [RSP +章] [RBP-代一】
  チャー V7。// [RSP + Dhを] [RBP-1BH] 
  チャー V8。// [RSP +え] [RBP-1AH] 
  チャー V9。// [RSP + Fhの] [RBP-19H] 
  チャー V10。// [RSP + 10H] [RBPから18h] 
  チャー V11。// [RSP + 11H] [RBP-17H] 
  チャー V12。// [RSP + 12H] [RBP-16時間] 
  チャー V13。// [RSP + 13H] [RBP-15H] 
  チャー V14。// [RSP + 14H] [RBP-14H] 
  チャー V15。// [RSP + 15H] [RBP-13H] 
  int型のI; // [RSP + 24時間] [RBP-4H] 

  V2 = 102 
  V3 = 109 
  V4 = 99 ; 
  V5 = 100 ; 
  V6 = 127 
  V7 = 107 ; 
  V8 = 55 ; 
  V9 = 100 ; 
  V10 = 59 ; 
  V11 = 86 ; 
  V12 = 96 
  V13 = 59 ; 
  V14 = 110 
  V15 = 112 (i = 0 ; iは<= 13 ; ++ I)
     *(_ BYTEの*)(iはA1 +)^ = I。
  (i = 0 ; iは<= 13 ; ++ I)
  { 
    もし(*(_ BYTEの*)(私はA1 +)= *(&V2 +!私は))
       を返す0LLを。
  } 
  戻り1LLと、
}

関数は、データ番号指定XOR結果が入力と比較さに応じて、解決は非常に簡単です。

 

WP:

V2 = 102 
V3 = 109 
V4 = 99 ; 
V5 = 100 ; 
V6 = 127 
V7 = 107 ; 
V8 = 55 ; 
V9 = 100 ; 
V10 = 59 ; 
V11 = 86 ; 
V12 = 96 
V13 = 59 ; 
V14 = 110 
V15 = 112件の

データ = []
 のための I における範囲(2,16 ):
  data.append(地元()' V' + STR(I)])

フラグ = '' 
のための I における範囲(14 ):
  フラグ + = CHR(データ[I] ^ I)

プリント(フラグ)

 

フラグ{n1c3_j0b}

 

おすすめ

転載: www.cnblogs.com/DirWang/p/11545027.html