【注意】このサイトに記載されていることを他人に試すことは「不正アクセス禁止法」に該当する場合があります。詳しくはこちらから

ハッカーは、GDBをマスターするとバイナリ解析がデバッグ機能により楽しくなります(まず、さわってみよう編)

ペネトレーションテスト&バグバウンティ

GDB(ジーディービー)は、C言語などのプログラムを「一歩ずつ」動かしたり、プログラムの中の変数の中身やメモリの状態をチェックできる道具です。

GDBとは

GDB(GNU Debugger)は、Cやアセンブリで書かれたプログラムをデバッグ(動作を調べたりバグを見つけたり)するための強力なツールです。
バイナリを読み解く力を付けたいなら、GDBは必修科目になります。
CTFやエクスプロイトの練習でも、GDBはレジスタやスタックの状態をリアルタイムで確認できる貴重な道具になります。
 

GDBを利用するに当たっての環境

 GDBは、Kali Linuxにインストールされている様子です。
まだ、インストールされていない方は、こちらをご覧ください。
仮想環境(VirtualBox 7.1)にKali Linux 2024.3をインストール手順
 
 

GDBの基本的な操作方法について

GDBは以下のように使います。(GDBの立ち上げまで)
 

サンプルプログラム

このサンプルプログラムは、GDBでステップ実行(1行ずつ動作を追う)や関数の呼び出しを確認ができます。
 
たとえばGDBでこのサンプルプログラムを実行すれば、
・main()にブレークポイントを置く
・kurochan()を呼び出すタイミングを見る
・printf()が実行されるところで中を見る
などができます。
 
// kurochan.c
#include <stdio.h>
 
int kurochan() {
    int number = 42;
    printf("Hello, kurochan!\n");
    return number;
}
 
int main() {
    int result = kurochan();
    printf("Result is %d\n", result);
    return 0;
}
 

サンプルプログラムの説明

このプログラムは、次のような流れで動きます。
・main()関数が実行される
・greet()関数が呼び出される
・greet()関数の中で「Hello, GDB!」と表示され、42が返される
・main()関数に戻り、その戻り値42を「Result is 42」として表示する
 
--**--
#include <stdio.h>
 
標準入出力ライブラリを使うための記述。
printf()関数を使えるようになります。
 
--**--
int kurochan() {
    int number = 42;
    printf("Hello, kurochan!\n");
    return number;
}
 
int number = 42;でローカル変数を定義して、その値を return で返しています。
メッセージ "Hello, kurochan!" を画面に出力する。
 
--**--
int main() {
    int result = kurochan();
    printf("Result is %d\n", result);
    return 0;
}
 
result には、greet() の戻り値 42 が入ります。
表示される内容は、
Hello, kurochan!
Result is 42
--**--
 

サンプルプログラムのコンパイル

gcc -g kurochan.c -o kurochan
 

サンプルプログラムの実行

./kurochan
 

GDB起動

gdb ./kurochan
 
これで、GDBの立ち上げまで出来ました。
 
 

GDBでよく利用される基本コマンドについて

 
1.run
プログラム実行
 
2.break main
greet関数にブレークポイント
 
3.next
現在の行を実行し、関数の中には入らない
 
4.step
現在の行を実行し、関数が呼ばれていれば中に入る
 
5.print var
変数の値を見る
 
 

ハッカーは、GDBをマスターするとバイナリ解析がデバッグ機能により楽しくなります(まず、さわってみよう編)のまとめ

 
GDBは、プログラムがどう動いているのかを調べることが出来るデバッガーです。
今回は、C言語でサンプルプログラムを作成して、デバックの為の基本的な命令を説明いたしました。
次に必要なものとして、レジスターの中身の確認があります。レジスターの操作ができれば、バイナリ解析が少し見えてくると思います。次回をお楽しみに。