緩沖區(qū)溢出——練習(xí)題3.43B解答

題目

《深入理解計(jì)算機(jī)系統(tǒng)(原書第2版)》第3章 程序的機(jī)器級(jí)表示
(a) C code

/* This is very low-quality code.
   It is intended to illustrate bad programming practices.
   See Problem 3.43. */
char *getline()
{
    char buf[8];
    char *result;
    gets(buf);
    result = malloc(strlen(buf));
    strcpy(result, buf);
    return result;
}

(b) Disassembly up through call to gets

080485c0 <getline>:
 80485c0:  55                   push   %ebp
 80485c1:  89 e5                mov    %esp,%ebp
 80485c3:  83 ec 28             sub    $0x28,%esp
 80485c6:  89 5d f4             mov    %ebx,-0xc(%ebp)
 80485c9:  89 75 f8             mov    %esi,-0x8(%ebp)
 80485cc:  89 7d fc             mov    %edi,-0x4(%ebp)
Diagram stack at this point
 80485cf:  8d 75 ec             lea    -0x14(%ebp),%esi
 80485d2:  89 34 24             mov    %esi,(%esp)
 80485d5:  e8 a3 ff ff ff       call   804857d <gets>
Modify diagram to show stack contents at this point

Figure 3.32 C and disassembled code for Problem 3.43.


練習(xí)器3.43

B.修改你的圖,展現(xiàn)調(diào)用gets的影響

解答

這個(gè)問(wèn)題覆蓋的問(wèn)題比較廣泛,例如棧幀、字符串表示、ASSCII碼和字節(jié)順序。

ASSCII碼

ASCII值 對(duì)應(yīng)的十六進(jìn)制值 控制字符
48 0x30 0
49 0x31 1
50 0x32 2
51 0x33 3
52 0x34 4
53 0x35 5
54 0x36 6
55 0x37 7
56 0x38 8
57 0x39 9

所以字符串“012345678901234567890123”的十六進(jìn)制值為
30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33
又由于字符串是以'\0'結(jié)尾,所以完整的十六進(jìn)制值為
30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 00

字節(jié)順序

由于是大端法表示,最高有效字節(jié)在最前面,所以地址最小的存儲(chǔ)的值是30,其次是31,依次類推。

棧幀

棧幀結(jié)構(gòu)圖

由于棧幀從下往上地址增加,所以緩沖區(qū)溢出以后,棧信息變?yōu)?/p>

08 04 86 00
33 32 31 30
39 38 37 36
35 34 33 32
31 30 39 38
37 36 35 34
33 32 31 30
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。