2012-05-29 5 views
0

Я пытаюсь написать код сборки, чтобы вызвать исключение стека, но до сих пор мне не повезло. Исключением стека в соответствии с инструкциями T-программиста AT & T является исключение стека, вызванное одним из следующих:Вызывает исключение стека (x86)

• Подразумеваемые ссылки на стек, в которых адрес стека не находится в канонической форме. Подразумеваемый стек ссылки включают все команды push и pop, а также любую инструкцию, использующую 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-rown). – DCoder

ответ

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

Простой переполнение стека. Раскомментируйте инструкцию popq, чтобы иметь бесконечный стек push/pop loop, потребляющий 100% одного ядра процессора.

Смежные вопросы