Open5

メモ帳 1月

tttttttttttttttttttt

CTF Q21.[Reversing]reversing easy!

気になった部分をメモ

中身を解析するだけで解決するが、「関数を書き忘れてしまったらしい…」とあるので、出力する方法を見つけたい。

この過程を記録しよう。

tttttttttttttttttttt

objdump -dついて

.init, .plt, .text, .finiの各セクションについて

  • .init

初期化コードを含むセクション

プログラムを実行する際に初期化するセクション。本当に初期化する。

  • .plt(Procedure Linkage T実行モデルを
    共有ライブラリの関数を呼び出すために使われる。

elfファイルなら、linuxで動作するので、libディレクトリ内にある共有ライブラリを読みこむ。

  • .text

プログラムの主要なコード(命令)が配置される

つまりここにコンパイルされる前のコードがある?

  • .fini

プログラムの終了処理を行う。

クリーンアップやリソース解放に使用される。

つまりソースコードは.textにありこの部分を編集すれば実行モデルを変更できる。

tttttttttttttttttttt

Ghidraで解析すると以下の内容。

undefined4 main(void)

{
  int in_GS_OFFSET;
  undefined2 local_4b;
  undefined local_49;
  int local_48;
  int local_44;
  int local_40 [9];
  undefined4 local_1a;
  undefined2 local_16;
  int local_14;
  
  local_14 = *(int *)(in_GS_OFFSET + 0x14);
  local_1a = 0x77617063;
  local_16 = 0x7b;
  local_40[0] = 0x79;
  local_40[1] = 0x61;
  local_40[2] = 0x6b;
  local_40[3] = 0x69;
  local_40[4] = 0x6e;
  local_40[5] = 0x69;
  local_40[6] = 0x6b;
  local_40[7] = 0x75;
  local_40[8] = 0x21;
  local_4b = 0xa7d;
  local_49 = 0;
  local_44 = 5;
  printf("%s",&local_1a);
  if (local_44 != 5) {
    for (local_48 = 0; local_48 < 9; local_48 = local_48 + 1) {
      putchar(local_40[local_48]);
    }
  }
  printf("%s",&local_4b);
  if (local_14 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return 0;
}

以下の部分が怪しい?

  if (local_44 != 5) {
    for (local_48 = 0; local_48 < 9; local_48 = local_48 + 1) {
      putchar(local_40[local_48]);
    }
  }

local_44が5だからputchar(local_40[local_48])が実行できない(printできない)

なのでlocal_44の値を変更すれば実行できるはず。

tttttttttttttttttttt

修正方法

ChatGPTに何回か聞くと以下の方法がある

  • hexedit yourfile.elf

hexeditというライブラリを使う

  • バイナリエディタを利用する方法

objdumpなどで編集したい部分を検索し、バイナリエディタなどを使って編集をおここなう。

  • インターセプトする共有ライブラリを作成→よくわからない

手順
インターセプトする共有ライブラリを作成:
例えば、関数の呼び出しを変更する。
#include <stdio.h>
int printf(const char *format, ...) {
write(1, "Intercepted!\n", 13);
return 0;
}
コンパイルする:
bash
コードをコピーする
gcc -shared -fPIC -o mylib.so mylib.c
実行時に挿入:
bash
コードをコピーする
LD_PRELOAD=./mylib.so ./yourfile.elf

多分実行ファイルで利用されている共有ライブラリの関数を変更することで、実行ファイルの挙動を変更している。

  • patchelf --set-rpath /new/library/path yourfile.elf