2013-05-09 58 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用作内存偏移量,而不是目标。