CpawCTF Q23.[Reversing]またやらかした!

またprintf()をし忘れたプログラムが見つかった。
とある暗号を解くプログラムらしい…
reversing200

Ghidraを使ってデコンパイルする。Ghidraは米国国家安全保障局が開発したソフトウェアリバースエンジニアリングフレームワークである。

Ghidraを立ち上げて、rev200を読み込ませて解析する。解析結果を得られたら、Filterにmainと入れ(①)、Symbol Treeのmainをダブルクリックする(②)と、③にデコンパイル結果が表示される。

スクリーンショット 2020-02-19 12.37.30

デコンパイルされた結果はこんな感じになっている。

undefined4 main(void)

{
 int iVar1;
 uint *puVar2;
 int local_84;
 uint local_7c [14];
 uint local_44 [14];
 
 local_7c[0] = 0x7a;
 local_7c[1] = 0x69;
 local_7c[2] = 0x78;
 local_7c[3] = 0x6e;
 local_7c[4] = 0x62;
 local_7c[5] = 0x6f;
 local_7c[6] = 0x7c;
 local_7c[7] = 0x6b;
 local_7c[8] = 0x77;
 local_7c[9] = 0x78;
 local_7c[10] = 0x74;
 local_7c[11] = 0x38;
 local_7c[12] = 0x38;
 local_7c[13] = 100;
 iVar1 = 0xe;
 puVar2 = local_44;
 while (iVar1 != 0) {
   iVar1 = iVar1 + -1;
   *puVar2 = 0;
   puVar2 = puVar2 + 1;
 }
 local_84 = 0;
 while (local_84 < 0xe) {
   local_44[local_84] = local_7c[local_84] ^ 0x19;
   local_84 = local_84 + 1;
 }
 return 0;
}

このプログラムを見ると、local_7cに16進数を入れて、0x19との排他的論理和(XOR)をlocal_44に入れているようだ。
ちょっと書き直してC言語でコンパイル、実行する。

#include <stdio.h>
// 修正 undefined4 -> int main
int main(void){

 int iVar1;
 // 修正 uint -> unsigned int
 unsigned int *puVar2;
 int local_84;
 unsigned int local_7c [14];
 unsigned int local_44 [14];
 
 local_7c[0] = 0x7a;
 local_7c[1] = 0x69;
 local_7c[2] = 0x78;
 local_7c[3] = 0x6e;
 local_7c[4] = 0x62;
 local_7c[5] = 0x6f;
 local_7c[6] = 0x7c;
 local_7c[7] = 0x6b;
 local_7c[8] = 0x77;
 local_7c[9] = 0x78;
 local_7c[10] = 0x74;
 local_7c[11] = 0x38;
 local_7c[12] = 0x38;
 local_7c[13] = 100;
 iVar1 = 0xe;
 puVar2 = local_44;
 while (iVar1 != 0) {
   iVar1 = iVar1 + -1;
   *puVar2 = 0;
   puVar2 = puVar2 + 1;
 }
 local_84 = 0;
 while (local_84 < 0xe) {
   local_44[local_84] = local_7c[local_84] ^ 0x19;
   //printf("%x, %x\n",local_44[local_84],local_7c[local_84]);
   local_84 = local_84 + 1;
 }
 
 // 追加 local_44を表示させる
 for(int i=0; i<14; i++){
     printf("%c", local_44[i]);
 }
 
 return 0;
}

実行するとフラグがゲットできる。

CpawCTF write-upまとめ

この記事が気に入ったらサポートをしてみませんか?