Learning ARM Exploit Development

1. はじめに

このリポジトリは、ARM 32bit アーキテクチャのExploit について学習することができるリポジトリです。各章のドキュメントを読みつつARM Exploit 開発について学ぶことができます。本コンテンツの対象読者層は、x86, amd64 のExploit 開発をしたことがある人です。そのため、説明が少し省略されている部分もあるとは思いますがご了承ください。

ARM の解析環境をお持ちでない方は、本ページの末尾にあるARM環境構築を参考に環境を構築してみてください。また、学習用ファイル を使っていくのでARM環境にダウンロードしてください。

Exploit コードには、プログラミング言語Ruby を利用しています。そのためホストOSにRuby の環境が必要となります。また、Exploit 用ライブラリpwntools-ruby をインストールしておくことで、サンプルコードを実行することができるようになります。

2. コンテンツ内容

下記に本コンテンツで学ぶことができる内容について表で示しています。

# タイトル 概要
1 Crafting Shellcode ARM アセンブリの基礎からシェルコード作成まで学びます
2 Buffer Overflow スタックベースのバッファオーバーフローの原理を学びます
3 Return to libc ARM Exploit におけるReturn to libcについて解説します
4 Playing with Canary ARM におけるCanaryの特徴について解説します

3. ARM環境構築

ARM の解析環境を持っていない人向けに環境構築の方法をご紹介します。持っている方はご自身の環境をご利用ください。ARM 環境の実現方法には、Qemu のシステムエミュレーションを利用します。また、ディストリビューションとしてはRaspberry Pi で有名なRaspbian (Debian Buster) を使用します。現段階ではホストOS には、macOS を想定していますが、おそらくQemu が動けば他のOS でも問題ないかと思います。

まずはじめに、Qemu をインストールしましょう。

$ brew install qemu # macOS
$ sudo apt install qemu # Ubuntu など

次に、エミュレートする際に必要な、カーネル、ディスクイメージ、DTB ファイルをダウンロードします。それぞれ以下のリンクからダウンロードしてください。

  • ディスクイメージ
    • http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_lite/images/
    • 2019-07-10-raspbian-buster-lite..zip (執筆当時)
  • カーネルとDTBファイル
    • https://github.com/dhruvvyas90/qemu-rpi-kernel
    • kernel-qemu-4.19.50-buster (執筆当時)
    • versatile-pb.dtb

上記ファイルのダウンロードと解凍が終わったら、以下の内容のシェルスクリプトrun.sh を作成してください。localhost の10022/tcp をRaspbian の22/tcp につなぐ設定になっているので、都合が悪ければ適宜変更してください。また、8888/tcp はexploit コードを送信するために使います。

#!/bin/sh
qemu-system-arm \
 -kernel kernel-qemu-4.19.50-buster \
 -cpu arm1176 \
 -M versatilepb \
 -dtb versatile-pb.dtb \
 -m 256 \
 -no-reboot \
 -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
 -hda 2019-07-10-raspbian-buster-lite.img \
 -nographic \
 -net nic -net user,hostfwd=tcp::10022-:22,hostfwd=tcp::8888-:8888

作成したrun.sh を実行するとカーネルの起動画面がターミナルに表示されます。しばらく待つと、以下のログインプロンプトが表示されるので、pi:raspberry でログインできます。

Raspbian GNU/Linux 10 raspberrypi ttyAMA0

raspberrypi login:

デフォルトではsshのサービスが起動していないので必要であれば起動してください。run.sh で指定したポート番号を用いて、ssh -p 10022 pi@127.0.0.1 でssh ログインすることができるようになります。

次に、本リポジトリで使うためのいくつかのソフトウェアをインストールしていきます。以下のコマンドを実行してください。

$ sudo apt install socat auditd
$ wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh

また、gefを使う際にロケールに起因したPythonのエラーが発生する可能性があるため、.bashrc に以下のexport LC_ALL=C.UTF-8 を追加して再度.bashrc を読み込んでください。

以上で、環境構築は終了です。