1

このプログラムでは、バッファの過剰な欠陥について質問があります。

#include <stdio.h>
#include <string.h>


int main(int argc, char **argv) {

char buf[10];

if(argc < 2) return 1;

strcpy(buf, argv[1]);

printf("%s\n", buf);

return 0;
}

このプログラムをメモリに流そうとすると:

[Barakat/at/System ~]$ gdb buff 
GNU gdb (GDB) Fedora (7.1-34.fc13)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<>...
Reading symbols from /home/Barakat/buff...(no debugging symbols found)...done.
(gdb) run AAAAAAAAAAAAAAAAAAAAAAAAAAAA
Starting program: /home/Barakat/buff AAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAA

Program received signal SIGSEGV, Segmentation fault.
0x08048434 in main ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12.1-4.i686
(gdb) info registers 
eax            0x0    0
ecx            0xbcd4e0    12375264
edx            0xbce340    12378944
ebx            0xbccff4    12374004
esp            0xbffff26c    0xbffff26c
ebp            0x41414141    0x41414141
esi            0x0    0
edi            0x0    0
eip            0x8048434    0x8048434 <main+64>
eflags         0x210246    [ PF ZF IF RF ID ]
cs             0x73    115
ss             0x7b    123
ds             0x7b    123
es             0x7b    123
fs             0x0    0
gs             0x33    51
(gdb)

このようにする必要があります:

**Program received signal SIGSEGV, Segmentation fault. 
0x41414141 in ?? ()**
(gdb) info registers 
eax 0x0 0 
ecx 0x1000 4096 
edx 0xd1c448 13747272 
ebx 0xd1aff4 13742068 
esp 0xbfffdcd0 0xbfffdcd0 
**ebp 0x41414141 0x41414141** 
esi 0x0 0 
edi 0xa38cc0 10718400 
[COLOR="Red"][B]eip 0x41414141 0x41414141 [/B][/COLOR]
eflags 0x210286 [ PF SF IF RF ID ] 
cs 0x73 115 
ss 0x7b 123 
ds 0x7b 123 
es 0x7b 123 
fs 0x0 0 
gs 0x33 51 
(gdb)

そのため、A(16進数で41)をEPIに書き込む必要がありますが、それは行われませんでした。

Linuxには、バッファオーバーフローが失敗するように、バッファオーバーフローから自身を保護する方法がありますか?または私が間違ったことをしたことがありますか?

4

2 に答える 2

3

EIPでのAAA...とそれに続く命令フェッチエラーを予期しているようです。

しかし、プログラムは実際には(1) AAA...をデータとしてロードしようとして失敗したようです。

実際、私の推測では、破損したスタックからEBPを「復元」し、他のレジスタを復元するためにAAA ... +(小さなオフセット)をロードしようとしました。

そして、それはあなたにあなたのセグメンテーション違反を与えました。


(1)SEGVを取得することは、あなたまたはあなたのディストリビューションがでコンパイルしていることを示唆します-fno-stack-protector

于 2010-12-25T01:05:05.503 に答える
0

はい、CPUはメモリセグメントとページを書き込み可能および実行可能としてマークします。OSで許可されていない(実行可能または書き込み可能としてマークされていない)ことを行おうとすると、CPUはOSによって処理される割り込みを発生させます。UNIXライクなオペレーティングシステムの場合、OSはSIGSEGVシグナル(処理可能ですが、回復できません)をアクセス違反が発生したプロセスに送信します。

スタックフレームの終わりをはるかに超えてオーバーフローしているようです。

于 2010-12-25T01:00:52.160 に答える