分析数组越界时:' 烫'的由来

来源:互联网 发布:单恋东野圭吾知乎 编辑:程序博客网 时间:2024/04/28 08:39

一.问题:以前c语言学习时候,当数组下标越界的时候,总是会出现‘烫烫烫烫烫烫烫’,这个到底是为什么呢?

二.上c语言代码

#include<stdio.h>void main(){char str[30]="apxar";printf("%c%c",str[30],str[31]);}

结果是'烫'


三.汇编代码分析

00401010 >|> \55            push ebp
00401011  |.  8BEC          mov ebp,esp
00401013  |.  83EC 60       sub esp,0x60                             ;  抬高栈顶
00401016  |.  53            push ebx
00401017  |.  56            push esi
00401018  |.  57            push edi
00401019  |.  8D7D A0       lea edi,[local.24]
0040101C  |.  B9 18000000   mov ecx,0x18
00401021  |.  B8 CCCCCCCC   mov eax,0xCCCCCCCC
00401026  |.  F3:AB         rep stos dword ptr es:[edi]              ;  以上3步,Debug情况下,会将栈变量初始化为0xcc,当产生异常,则会中断,这里指ebp-60开始的地址
00401028  |.  A1 20204200   mov eax,dword ptr ds:[0x422020]          ;  eax=0x61787061("apxa")
0040102D  |.  8945 E0       mov [local.8],eax                        ;  esp-20="apxa"
00401030  |.  66:8B0D 24204>mov cx,word ptr ds:[0x422024]            ;  cx='r'
00401037  |.  66:894D E4    mov word ptr ss:[ebp-0x1C],cx            ;  ebp-0x1c='r',以上3步将我们的数组值'apxar'复制到ebp-20地址
0040103B  |.  B9 06000000   mov ecx,0x6
00401040  |.  33C0          xor eax,eax
00401042  |.  8D7D E6       lea edi,dword ptr ss:[ebp-0x1A]
00401045  |.  F3:AB         rep stos dword ptr es:[edi]              ;  将栈中数组值apxar后的值,清0,所以当访问数组下标内的值时,当未初始化,则为0
00401047  |.  0FBE55 FF     movsx edx,byte ptr ss:[ebp-0x1]
0040104B  |.  52            push edx                                 ; /<%c>
0040104C  |.  0FBE45 FE     movsx eax,byte ptr ss:[ebp-0x2]          ; |
00401050  |.  50            push eax                                 ; |<%c>
00401051  |.  68 28204200   push test.00422028                       ; |format = "%c%c"
00401056  |.  E8 75000000   call test.printf                         ; \printf

三.

1.我们查看下当执行到

地址00401047  |.  0FBE55 FF     movsx edx,byte ptr ss:[ebp-0x1]时,栈的情况:

EBP-60   > CCCCCCCC  烫烫
EBP-5C   > CCCCCCCC  烫烫
EBP-58   > CCCCCCCC  烫烫
EBP-54   > CCCCCCCC  烫烫
EBP-50   > CCCCCCCC  烫烫
EBP-4C   > CCCCCCCC  烫烫
EBP-48   > CCCCCCCC  烫烫
EBP-44   > CCCCCCCC  烫烫
EBP-40   > CCCCCCCC  烫烫
EBP-3C   > CCCCCCCC  烫烫
EBP-38   > CCCCCCCC  烫烫
EBP-34   > CCCCCCCC  烫烫
EBP-30   > CCCCCCCC  烫烫
EBP-2C   > CCCCCCCC  烫烫
EBP-28   > CCCCCCCC  烫烫
EBP-24   > CCCCCCCC  烫烫
EBP-20   > 61787061  apxa
EBP-1C   > 00000072  r...
EBP-18   > 00000000  ....
EBP-14   > 00000000  ....
EBP-10   > 00000000  ....
EBP-C    > 00000000  ....
EBP-8    > 00000000  ....
EBP-4    > CCCC0000  ..烫
EBP ==>  >/0018FF88  ?.

可见[ebp-1]即为0xCC,此处即为str[31]

2.当执行到

地址0040104C  |.  0FBE45 FE     movsx eax,byte ptr ss:[ebp-0x2]     时,[ebp-0x2]即为0xcc,此处 即为str[30]


四.结果.printf("%c%c",0xcc,0xcc);即为烫


五.总结,当在debug模式下,由于栈变量被初始化为0xcc,当数组下标溢出时,访问到0xcc 0xcc,输出时,则为 烫,当然还有可能是其他的值~












0 0
原创粉丝点击