我目前正在反汇编一些用 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]
那么,为什么机器会用这个 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 dwords 存储在这里是因为一些 if 语句,但我只是想知道为什么它们被放置在它们所在的位置。如果它背后有任何逻辑。
谢谢你。