2013-05-09 91 views
11

什麼是字節溢出?爲什麼發生字節溢出,它們實現了什麼?

當我從C程序生成的LLVM中間表示中轉儲x86 ASM時,會出現大量溢出,通常是4字節大小。我無法弄清楚它們爲什麼會發生以及它們實現了什麼。

他們似乎「砍」堆棧的棋子落,但在一個不尋常的方式:

## this fragment comes from a C program right before a malloc() call to a struct. 
## there are other spills in different circumstances in this same program, so it 
## is not related exclusively to malloc() 
... 
sub ESP, 84 
mov EAX, 60 
mov DWORD PTR [ESP + 80], 0 
mov DWORD PTR [ESP], 60 
mov DWORD PTR [ESP + 60], EAX # 4-byte Spill 
call malloc 
mov ECX, 60 
... 

回答

12

寄存器溢出僅僅是當你有比寄存器(它是一個比喻更局部變量會發生什麼 - 真的意思是他們必須保存到內存中)。該指令保存了EAX的值,可能是因爲EAX被malloc破壞了,並且你沒有另一個備用寄存器來保存它(並且由於某種原因,編譯器已經決定它需要稍後的寄存器中的常數60)。

通過它的外觀,編譯器當然可以省略mov DWORD PTR [ESP + 60], EAX,而是重複mov EAX, 60它本來mov EAX, DWORD PTR [ESP + 60]或任何抵消其使用,因爲EAX的保存價值不能超過60,在這一點上是其他。但是,彙編不保證是最佳的。

請記住,在sub ESP, 84之後,堆棧大小不會被調整(除非通過調用指令,當然這會推送返回地址)。以下說明將ESP用作內存偏移量,而不是目標。