メモ帳 1月

CTF Q21.[Reversing]reversing easy!
気になった部分をメモ
中身を解析するだけで解決するが、「関数を書き忘れてしまったらしい…」とあるので、出力する方法を見つけたい。
この過程を記録しよう。

objdump -d
ついて
.init
, .plt
, .text
, .fini
の各セクションについて
.init
初期化コードを含むセクション
プログラムを実行する際に初期化するセクション。本当に初期化する。
-
.plt
(Procedure Linkage T実行モデルを
共有ライブラリの関数を呼び出すために使われる。
elfファイルなら、linuxで動作するので、libディレクトリ内にある共有ライブラリを読みこむ。
.text
プログラムの主要なコード(命令)が配置される
つまりここにコンパイルされる前のコードがある?
.fini
プログラムの終了処理を行う。
クリーンアップやリソース解放に使用される。
つまりソースコードは.text
にありこの部分を編集すれば実行モデルを変更できる。

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の値を変更すれば実行できるはず。

putchar(○○)
print()に該当する出力部分

修正方法
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