読者です 読者をやめる 読者になる 読者になる

撤退

参加報告を記します.

CTF for ビギナーズ Final に参加した。( bin 300 Writeup )

SECCON Online 予選で pwn が全くできないということが身に染みて分かったので,論発表直前でしたが ctf4b final に行きました. 関係者の皆様ありがとうございました.

結果は4位だったのでとても辛かったです. 2問目の forensic 200, web 200 の union select を用いた sqli で凡ミスをしてしまったのが原因といったところだと思います. 引き続き頑張っていきたいと思います.

bin300 の Write up だけ書こうと思います.

ctf4b bin 300 Cipher

checksec

RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FORTIFY Fortified Fortifiable  FILE
Partial RELRO   Canary found      NX enabled    No PIE          No RPATH   No RUNPATH   Yes     0               4    bin300

解法

main() 関数にて流れを追うと次のことがわかる.

  • 文字列を入力に取る
  • check_flag() 関数を呼ぶ
  • 戻り値が 0 なら "Correct!\n" そうでないなら "Wrong...\n" を出力する.

Flag を入力すると check_flag() 関数の戻り値が 0 になることがわかる. check_flag() 関数は次のようなことを行っている.

int check_flag(char *input_str)
{
  char encrypted[] = encrypted flag;
  char* buf;

  srand(0);
  buf = malloc(strlen(input_str) + 1);

  for (int i = 0; input_str[i]; i++)
    buf[i] = input_str[i] ^ rand();

  return strcmp(encrypted, buf);
}

それぞれの変数とアドレスの対応は次のようになっている.

  • [ebp-0x2c] buf
  • [ebp-0x30] i
  • [ebp-0x3c] input_str

solver は次にようになった.