0

我正在尝试编写汇编代码以导致堆栈异常,但到目前为止我还没有运气。根据 AT&T 程序员手册,堆栈异常是由以下原因之一引起的:

• 堆栈地址不是规范形式的隐含堆栈引用。隐含的堆栈引用包括所有推送和弹出指令,以及使用 RSP 或 RBP 作为基址寄存器的任何指令。• 尝试加载一个堆栈段选择器,该选择器引用一个包含清除存在位(descriptor.P=0)的段描述符。• 任何未通过堆栈限制检查的堆栈访问。

我选择了第一种方法;我正在尝试使用以下代码以非规范形式加载 rsp:

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

GDB 只是说了一些关于无法解决内存的问题,并且一切都中断了,而不是异常。有没有人有任何想法?如果没有,有人知道我如何使用第三个条件导致异常吗?我不知道“堆栈限制检查失败”是什么意思。谢谢!

4

1 回答 1

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

简单的堆栈溢出。取消注释 popq 指令以使无限堆栈推入/弹出循环消耗 100% 的一个 cpu 内核。

于 2012-05-29T20:05:31.687 回答