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はLinuxで使えるバイナリエディタである。デフォルトではインストールされてないので、以下のコマンドでインストールする。
$ sudo dnf install hexedit
以下のコマンドでa.outを開くことができる。
$ hexedit a.out
操作方法はF1キーを押せばmanページに飛んで確認することができるが、矢印キーで移動することができ、Ctrl + Cで終了することができる。
文字列を探す場合、tabを押してhex→asciiに切り替えたうえで、Ctrl + Sで検索することができる。検索機能を使って"password"という文字列を検索してみると検索に引っかかり、ソースコード内で書いた"hogehoge"という文字列も確認できる。
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