<< main関数内でローカル変数を使う | top | 聖書 >>

スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | | - | - |

バッファオーバーフローを利用したクラック

 「HACKING:美しき策謀」を150ページくらいまで読んだ。
最初の方はC言語入門みたいなことが書いてあった。
アセンブリコードと対応づけて書いてあって面白かった。
ただ、これでC言語に入門するのは無理だと思う。
あらかじめそれなりの知識が必要だろう。

で、ようやくハックの例に入った。バッファオーバーフローを利用したハックで、
興味深かった。で、ちょっと怖かった。具体的な内容はここには書かない。

理解の助けに簡単なCコードを読み解いてみた。特にスタックポインタらへん。

コードは
#include <stdio.h>

int f(int i)
{
int j = 4;
return i*j;
}

int main(void)
{
int i = 256;
f(i);
return 0;
}
まずアセンブリコードを示す。
(gdb) disassemble f
Dump of assembler code for function f:
0x08048344 <f+0>:       push   ebp
0x08048345 <f+1>:       mov    ebp,esp
0x08048347 <f+3>:       sub    esp,0x4
0x0804834a <f+6>:       mov    DWORD PTR [ebp-4],0x4
0x08048351 <f+13>:      mov    eax,DWORD PTR [ebp+8]
0x08048354 <f+16>:      imul   eax,DWORD PTR [ebp-4]
0x08048358 <f+20>:      leave  
0x08048359 <f+21>:      ret    
End of assembler dump.
(gdb) disassemble main
Dump of assembler code for function main:
0x0804835a <main+0>:    push   ebp
0x0804835b <main+1>:    mov    ebp,esp
0x0804835d <main+3>:    sub    esp,0x8
0x08048360 <main+6>:    and    esp,0xfffffff0
0x08048363 <main+9>:    mov    eax,0x0
0x08048368 <main+14>:   sub    esp,eax
0x0804836a <main+16>:   mov    DWORD PTR [ebp-4],0x100
0x08048371 <main+23>:   mov    eax,DWORD PTR [ebp-4]
0x08048374 <main+26>:   mov    DWORD PTR [esp],eax
0x08048377 <main+29>:   call   0x8048344 <f>
0x0804837c <main+34>:   mov    eax,0x0
0x08048381 <main+39>:   leave  
0x08048382 <main+40>:   ret    
End of assembler dump.

main関数のint i = 256のところとfのreturn i*jのところにブレイクポイントを設定する。
走らせてespの値を確認する。
Breakpoint 2, main () at test.c:11
11      int i = 256;
(gdb) i r esp
esp            0xbffff830       0xbffff830
続けてf関数に入る。espの指すアドレス周辺を見る。
Breakpoint 1, f (i=256) at test.c:6
6       return i*j;
(gdb) i r esp
esp            0xbffff824       0xbffff824
(gdb) x/32w $esp
0xbffff824:     0x00000004      0xbffff838      0x0804837c      0x00000100
0xbffff834:     0x00000100      0xbffff898      0xb7eafebc      0x00000001

main関数のときはespは0xbffff830を指していた。まず最初に引数をpushする
(gccの場合単純なpushではないようだけど)。
次にcall命令でリターンアドレスをpushし、制御をfに移す。
次にベースポインタの値を退避させる。
調べてみると
11      int i = 256;
(gdb) i r ebp
ebp            0xbffff838       0xbffff838
最後にローカル変数を定義する。

教科書どおりになってますね。
ジャジャガッチ | アセンブリ言語 | 21:56 | comments(0) | trackbacks(0) |

スポンサーサイト

スポンサードリンク | - | 21:56 | - | - |
Comment









Trackback
URL:

07
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH