CpawCTF Q23.[Reversing]またやらかした!
またprintf()をし忘れたプログラムが見つかった。
とある暗号を解くプログラムらしい…
reversing200
Ghidraを使ってデコンパイルする。Ghidraは米国国家安全保障局が開発したソフトウェアリバースエンジニアリングフレームワークである。
Ghidraを立ち上げて、rev200を読み込ませて解析する。解析結果を得られたら、Filterにmainと入れ(①)、Symbol Treeのmainをダブルクリックする(②)と、③にデコンパイル結果が表示される。
デコンパイルされた結果はこんな感じになっている。
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;
}
実行するとフラグがゲットできる。
この記事が気に入ったらサポートをしてみませんか?