为什么堆栈填充0xCCCCCCCC

Vol*_*ile 17 assembly disassembly

我目前正在拆解Visual Studio 2012 Express中的一些小型C程序,我注意到了二进制文件中的一种趋势.

在main函数中执行的第一组指令总是:

SUB ESP,154                       ; Doesn't have to be 0x154.
.....
.....
.....
LEA EDI,DWORD PTR SS:[EBP-154]
MOV ECX,55                        ; Also doesn't have to be 0x55.
MOV EAX,CCCCCCCC
REP STOS DWORD PTR ES:[EDI]
Run Code Online (Sandbox Code Playgroud)

那么,为什么机器用这个0xCCCCCCCC填充堆栈?我已经读过它被VC++或其他东西用作未初始化空间的标记?

然后让我说我要把一些东西放进我的缓冲区......编译器或处理器决定将它放在这个空间内的某个随机点,但是我不明白为什么它会把它放在那里......

EBP-90   > CCCCCCCC  ÌÌÌÌ
EBP-8C   > CCCCCCCC  ÌÌÌÌ
EBP-88   > CCCCCCCC  ÌÌÌÌ
EBP-84   > 00000001  ...  ; Why this place?
EBP-80   > CCCCCCCC  ÌÌÌÌ
EBP-7C   > CCCCCCCC  ÌÌÌÌ
EBP-78   > 41414141  AAAA ; Why this far from both the top and bottom of the stack?
EBP-74   > CCCCCC00  .ÌÌÌ
EBP-70   > CCCCCCCC  ÌÌÌÌ
EBP-6C   > CCCCCCCC  ÌÌÌÌ
Run Code Online (Sandbox Code Playgroud)

和...

EBP-14   > CCCCCCCC  ÌÌÌÌ
EBP-10   > CCCCCCCC  ÌÌÌÌ
EBP-C    > 00000000  ....  ; Why here?
EBP-8    > CCCCCCCC  ÌÌÌÌ
EBP-4    > 7EA7D069  iЧ~  ; I think this is some stack cookie stuff.
EBP ==>  >/0017FEA8  ¨þ.   ; Saved EBP.
Run Code Online (Sandbox Code Playgroud)

当然,这里存储的1和0双字是由于一些if语句,但我只是想知道为什么它们被放置在它们所在的位置.如果背后有任何逻辑.

谢谢.

Han*_*ant 25

您只是看到使用/ RTC选项时MSVC编译器生成的代码.这启用了运行时检查,默认情况下在调试版本中打开.值0xcccccccc是神奇的,它非常适合在使用未初始化的指针时崩溃程序.或者生成一个奇怪的int值.或者当代码进入香蕉时崩溃并开始执行数据,就好像它是代码一样.0xcc是INT 3的x86指令,它调用调试器中断.

"为什么这个地方"是您从/ RTC获得的诊断的一部分.它使编译器分配局部变量,并在它们之间留出额外的空间.充满了神奇的价值.这使得诊断缓冲区溢出导致的堆栈损坏变得非常简单,它只需要在函数返回时检查魔术值是否仍然存在.

  • 每当您在调试器中看到3435973836或-858993460时.你去,嗯,这很奇怪,这不是人类输入的价值.他们没有. (2认同)