hexedit、stringsを使ってバイナリから文字列を取り出す

Last update: 2025/1/2


実行環境

バイナリから文字列を取り出してみる

今回はlinuxで使えるバイナリ解析のツールを使ってバイナリから文字列を取り出す方法をまとめる。今回は以下のコードをコンパイルしたバイナリからhogehogeという文字列を取り出してみる。入力されたパスワードとソースコード内で定義したパスワードが一致していたら"correct password."と表示するという内容になっている。

#include <iostream>
#include <string>

int main() {
        std::string input;
        std::cin >> input;
        std::string password = "hogehoge";

        if(input == password) {
                std::cout << "correct password." << std::endl;
        }
        return 0;
}

上記のコードをbin_analysis.cppという名前で保存して、以下のコマンドでgccでコンパイルして作成したa.outを解析する。

g++ bin_analysis.cpp

なお、通常ソースコード内にパスワードを平文で書くことは(まともなコードであれば)ありえずハッシュ関数を使うなりするため、あくまで実験用のコードである。

hexeditを使う

hexeditはLinuxで使えるバイナリエディタである。デフォルトではインストールされてないので、以下のコマンドでインストールする。

$ sudo dnf install hexedit

以下のコマンドでa.outを開くことができる。

$ hexedit a.out

操作方法はF1キーを押せばmanページに飛んで確認することができるが、矢印キーで移動することができ、Ctrl + Cで終了することができる。

文字列を探す場合、tabを押してhex→asciiに切り替えたうえで、Ctrl + Sで検索することができる。検索機能を使って"password"という文字列を検索してみると検索に引っかかり、ソースコード内で書いた"hogehoge"という文字列も確認できる。

stringsを使う

stringsコマンドは、バイナリを1バイトごとASCIIコードとして解釈して表示するコマンドである。私の環境ではすでにインストールされていた。

以下のコマンドでa.outを解析すると、表示される文字列の中に"hogehoge"という文字列を確認することができる。

$ strings a.out
/lib64/ld-linux-x86-64.so.2
CxIk
…略…
hogehoge
correct password.
…略…

参考文献

小林 佐保/岡田 怜士/浅部 佑/満永 拓邦, "はじめて学ぶバイナリ解析 不正なコードからコンピュータを守るサイバーセキュリティ技術", 2020, インプレスR&D


Copyright (c) 2024 kd