もうちょっと説明書いてほしいなぁ( ;๑・ิټ・ิ๑)
これがなんだか分からんがとりあえず
今日勉強したところは、昨日の続きで、
今回の課題は
『本当にリターンアドレスを書き換えることで
shellcodeを実行させることが出来るのかを試す』
ということです。
( ๑・ิټ・ิ๑)『最初の *r は int型のポインタだね。』
( ๑・ิټ・ิ๑)『shellcodeは昨日の引用だね』
( ๑・ิټ・ิ๑)『 __asm__("movl %ebp,r\n"); は〜、
普通に考えたら、 %ebp = r\n ということで、
特に何も考えることは無いが…。
( ;๑・ิټ・ิ๑)『待ってくれ…。良いんだが…、 %ebpって何??』
( ;๑・ิټ・ิ๑)『ベースポインタだろ…?ってことは、
『r というアドレスを 基準とする』ということを言いたいのか?』
✌( ՞ਊ ՞)✌
WAKARAN!
( ;๑・ิټ・ิ๑)『分かる人は教えてください』
( ๑・ิټ・ิ๑)『次ぎにいこうじゃないか。』
10分後…。
( ;๑・ิټ・ิ๑) 『再来じゃ…。祟りじゃ!
* ( r + 1 ) = ( int ) shellcode ;
って簡単に言うたら、 文字列shellcodeを int型にキャストして、
アドレスr に1(先輩曰く4バイト)を足したポインタ に代入。』
( (;๑・ิټ・ิ๑) 『文法的に理解は出来るが、何がしたいのか分からん。』
本に書いてあるのが、
--------------------------------------------------------------------------------------------------------------
| shellcode ........... ......... ....... ......... ............|%ebp | ret |
------------------------------------------------------------------------------------------------------------
0000001c ==> 00000034
( ๑・ิټ・ิ๑)『main関数が実行させる直前のスタックはこのようになっております。』
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
| | | | | 00000034 | %ebp | ret |
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ーーーーー
0000001c ==> 00000034
( ๑・ิټ・ิ๑)『 r はint 型です。よって 4バイトです。 愛甲さんは次にアドレスに2を加算すると r にはリターンアドレスのアドレス(0000034) が格納されることになる。
っていってるけど、『どこにも 2という数が無い』 』
( ;๑・ิټ・ิ๑) 『どういうことやぁ…。死にたくない…。 分からん…。』
本を眺めること 1分…。 ( (๑・ิټ・ิ๑)むっ!!!!!?
いやぁ、分からん…。
( ๑・ิټ・ิ๑)はい。わからないです。
( ๑・ิټ・ิ๑)しらん。わからんもんしかたないやん。
( ๑・ิټ・ิ๑) だれか助けてください
( ๑・ิټ・ิ๑)shellcodeを実行させる上で重要なポイントは2つ。
( ๑・ิټ・ิ๑)1. shellcodeをターゲットプログラムのどこかに埋め込む
2. リターンアドレスをshellcodeの先頭アドレスをさすように上書きする
です。
( ๑・ิټ・ิ๑):だから、
shellcodeのまえをすべて NOPにしてやればええやないか。
ってことです。
( ๑・ิټ・ิ๑)ちなみに、じっこうするには
$ gcc -Wa,--execstack hoge.c -o hoge
$ hoge
sh-2.05b$
って出来るから!
うん。
( ๑・ิټ・ิ๑)『これ書いたの夜中の 3:40分、 眠くないなぁ。なんでだろ?』
『これ分かる人教えてください』
( ๑・ิټ・ิ๑)『ばいばーい』