2012-05-29 3 views
0

스택 예외를 발생시키는 어셈블리 코드를 작성하려고하지만 지금까지 행운이 없습니다. AT & T 프로그래머 설명서에 따르면 스택 예외는 다음 중 하나에 의해 발생합니다.스택 예외 발생 (x86)

• 스택 주소가 표준 형식이 아닌 묵시적 스택 참조. 묵시적 스택 참조는 모든 밀어 넣기 및 띄우기 명령어와 기본 명령어 인 으로 RSP 또는 RBP를 사용하는 명령어를 모두 포함합니다. • 투명 비트 (descriptor.P = 0)을 포함하는 세그먼트 설명자를 참조하는 스택 세그먼트 선택기를로드하려고 시도했습니다. • 스택 제한 검사에 실패한 모든 스택 액세스.

나는 첫 번째 방법으로 갔다. 나는 다음과 같은 코드가 아닌 정식 양식 RSP를로드하려고 :

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

GDB는 메모리와 모든 것을 중단하는 대신 예외를 처리 할 수 ​​없다는 대해 뭔가를 말한다. 누구든지 아이디어가 있습니까? 그렇지 않은 경우 누구나 제 3 조건을 사용하여 예외가 발생할 수 있음을 알고 있습니까? 나는 "stack-limit check가 실패했다"는 것을 모른다. 감사!

+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" 
    ); 

간단한 스택 오버플로. 무한 스택 누름/팝 루프가 하나의 CPU 코어의 100 %를 소비하도록하려면 popq 명령의 주석을 제거하십시오.