babyrev

ELFファイルが与えられた。
Ghidraで逆コンパイルすると、以下のmain関数があった。

A ELF file was given.
Decompiling the ELF file via Ghidra, I found this function main.

main.c

この関数は、以下の処理をしていた。

  1. fgets関数で入力を読み取る。
  2. 入力の最初と最後がflagのものか、および入力の長さをチェックする。
  3. 入力の各文字について、添字の4倍以上の最小の素数を用いて文字をずらす。
  4. 処理結果を、checkのデータをmemfrob関数で処理したものと比較する。

memfrob関数について調べたところ、各バイトに42をXORする関数のようである。
Man page of MEMFROB

さらに、checkの内容も、Ghidraの表示を参考にELFファイル中から発見することができた。
これらの情報を用い、以下のプログラムでflagを求めた。

This function does:

  1. Read some input via the function fgets.
  2. Check if the head and tail of the input are ones of the flag, and if the length of the input is what is expected.
  3. Shift the characters in the input using the least prime numbers which are not less than the indice of the characters multiplied by 4.
  4. Compare the result with the data in the check processed via the function memfrob.

I studied about the function memfrob and found that the function takes exclusive-or of each bytes wth 42.
memfrob(3) - Linux manual page

Also I found the contents of check from the ELF file, referring to what Ghidra displays.
Using these information, I obtained the flag via this program:

solve.pl

corctf{see?_rEv_aint_so_bad}

corCTF 2021