androidでpwnできる環境を作ってみる

ndk-buildにより作成したプログラムをandroid上で待ち受けさせる。arm環境でpwnするときに使える。

準備

プログラムを用意する

ソース

/* test.c */
# include <stdio.h>

int main(void) {
  printf("Hello, world!\n");
  return 0;
}

ビルドスクリプト

Application.mkを作成する。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := test
LOCAL_SRC_FILES := test.c

include $(BUILD_EXECUTABLE)

ここではやっていないが、APP_CFLAGS += -fno-stack-protector を書くことでSSPを無効にできる。

ビルドする

$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Application.mk
$ adb push libs/arm64-v8a/test /data/local/tmp/
$ adb shell
shell@android:/data/local/tmp $ ./test
Hello, world!

socatを入れる

androidにはsocatコマンドが入っていないので、socat for android - Post #28からzipをダウンロードしてadbで入れる。

$ adb push ~/downloads/socat-2.0.0-b7-armv7-a /data/local/tmp/

やってみる

adbで端末に接続し、socatで待ち受ける。

$ adb forward tcp:10001 tcp:10001
$ adb shell
shell@android:/data/local/tmp $ cd /data/local/tmp/
shell@android:/data/local/tmp $ ./test
Hello, world!
shell@android:/data/local/tmp $ ip a
...
21: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 30:5a:3a:aa:56:33 brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.67/24 brd 192.168.3.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::325a:3aff:feaa:5633/64 scope link 
       valid_lft forever preferred_lft forever
shell@android:/data/local/tmp $ ./socat TCP4-LISTEN:10001,fork EXEC:./test

別のshellからnetcatで接続する。

$ nc 192.168.3.67 10001
Hello, world!

無事に接続できた。