我目前正在拆解Visual Studio 2012 Express中的一些小型C程序,我注意到了二进制文件中的一种趋势。
主函数中执行的第一组指令始终为:
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]
那么,为什么机器用这个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 ÌÌÌÌ
和...
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.
当然,这里存储的1和0双字是由于一些if语句,但我只是想知道为什么它们被放置在它们所在的位置。如果背后有任何逻辑。
谢谢。
答案 0 :(得分:24)
您只是看到使用/ RTC选项时MSVC编译器生成的代码。这启用了运行时检查,默认情况下在调试版本中打开。值0xcccccccc是神奇的,当你使用未初始化的指针时,非常擅长崩溃你的程序。或者生成一个奇怪的 int 值。或者当代码进入香蕉时崩溃并开始执行数据,就好像它是代码一样。 0xcc是INT 3的x86指令,它调用调试器中断。
“为什么这个地方”是您从/ RTC获得的诊断的一部分。它使编译器在它们之间分配额外空间的局部变量。充满了神奇的价值。这使得诊断缓冲区溢出导致的堆栈损坏变得非常简单,它只需要在函数返回时检查魔术值是否仍然存在。
答案 1 :(得分:3)
我不能代表Visual Studio,但是我编码的某些环境故意用预定值填充堆栈(例如0xcccccccc)。这样做是为了扫描堆栈(从底部开始)以确定未使用多少。在内存量相当有限的嵌入式系统上,这在开发过程中非常有用,因此可以优化内存使用。
希望这有帮助。