2012-05-29 122 views
0

我正在尝试编写汇编代码来导致堆栈异常,但到目前为止我还没有运气。根据AT编程手册,堆栈异常是由下列之一引起的:导致堆栈异常(x86)

•隐含的堆栈引用,其中堆栈地址不是规范形式。隐含堆栈 引用包括所有推入和弹出指令,以及任何使用RSP或RBP作为基址的指令寄存器 。 •尝试加载引用段描述符的堆栈段选择器,该段描述符包含当前位(描述符.P = 0)的明确 。 •堆栈限制检查失败的任何堆栈访问。

我去了第一种方法;我试图用非规范的形式用下面的代码加载RSP:

asm volatile("mov $0xAAAAAAAA00000000, %%rax;" 
        "orq %%rax, %%rsp;" 
        "push %%rax;" : : :); 

GDB只是说一些关于不能够解决内存和一切休息,而不是例外。有没有人有任何想法?如果没有人知道我可以如何使用第三个条件导致异常?我不知道“堆栈限制检查失败”是什么意思。谢谢!

+1

最简单的方法可能会一直调用自己,直到你溢出堆栈。请参阅[一些不涉及递归的替代方法](http://stackoverflow.com/questions/1583490/without-using-recursion-how-can-a-stack-overflow-exception-be- thrown)。 – DCoder

回答

1
asm(
    "\n" 
    "MYLOOP:\n\t" 
    "pushq %rbp\n\t" 
    //"popq %rbp\n\t" 
    "jmp MYLOOP\n\t" 
    ); 

简单堆栈溢出。取消注释掉popq指令,使无限栈压入/弹出循环占用一个cpu核心的100%。