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}