国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java緩沖區溢出編程心得

2019-11-18 10:41:29
字體:
來源:轉載
供稿:網友

  原創作者:sanool

    前言:網上關于緩沖區溢出的資料也有很多,但我在閱讀過程中發現介紹的都不是很明了,而且各網站也只是轉貼老外的那篇譯文而已,不僅內容有缺損,而且程序也無法調通,因為GCC版本不一樣.經過幾天的琢磨,終于明白了真正的原理,特地寫出來分享.

測試環境:
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/specs
Configured with: ../configure --PRefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-24)

$ gdb -v
GNU gdb Red Hat Linux (6.0post-0.20031117.6rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu".

$ uname -a
Linux candy 2.4.21-9.EL #1 Thu Jan 8 17:03:13 EST 2004 i686 athlon i386 GNU/Linux

   實例:
   網上和我的這個實例雷同的也有,但是他們的是無法正確實現的.因為要害的跳轉代碼沒有計算正確.(GCC版本問題,呵呵)
/************
* a.c
************/
void function(void)
{
char buffer[5];
int* ret;

ret=buffer+28;
(*ret)+=10;
}

void main()
{
int x;

x=0;
function();

x=1;
printf("%d/n",x);

return;
}
/*end*/

   懂C語言的人都會認為最后的輸出結果是1,可惜輸出結果為0.為什么呢?請聽解釋.

   實例分析:
相關堆棧的基礎知識我就不羅嗦了,網上的介紹很多.
要害問題在于如何確定源代碼
ret=buffer+28;
(*ret)+=10;
中的28 和 10

編譯(會有warning,不用管他.)
$gcc -g -o a a.c //加上-g 用來在gdb中調試

$gdb a
(gdb)disas main //得到反匯編代碼 如下:
Dump of assembler code for function main:
0x08048366 <main+0>: push %ebp
0x08048367 <main+1>: mov %esp,%ebp
0x08048369 <main+3>: sub $0x8,%esp
0x0804836c <main+6>: and $0xfffffff0,%esp
0x0804836f <main+9>: mov $0x0,%eax
0x08048374 <main+14>: sub %eax,%esp
0x08048376 <main+16>: movl $0x0,0xfffffffc(%ebp)
0x0804837d <main+23>: call 0x8048348 <function>
0x08048382 <main+28>: movl $0x1,0xfffffffc(%ebp)
0x08048389 <main+35>: sub $0x8,%esp
0x0804838c <main+38>: pushl 0xfffffffc(%ebp)
0x0804838f <main+41>: push $0x8048474
0x08048394 <main+46>: call 0x8048288
0x08048399 <main+51>: add $0x10,%esp
0x0804839c <main+54>: leave
0x0804839d <main+55>: ret
End of assembler dump.

(gdb)disas function
Dump of assembler code for function function:
0x08048348 <

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 布尔津县| 泰和县| 隆回县| 赫章县| 商南县| 吐鲁番市| 南陵县| 海丰县| 巫溪县| 仁怀市| 青阳县| 开鲁县| 哈密市| 邓州市| 龙江县| 天长市| 东阿县| 田林县| 龙游县| 萨嘎县| 巴塘县| 饶河县| 越西县| 青铜峡市| 尚志市| 定日县| 克山县| 镇赉县| 峡江县| 祁阳县| 富民县| 陇西县| 连州市| 紫金县| 托克托县| 迁安市| 西乌珠穆沁旗| 安陆市| 松桃| 穆棱市| 保康县|