변화된 스택구조를 볼 수 있나요? - 어셈에서..

jenix의 이미지

안녕하세요..

요즘 어셈공부를 하고있는데요;; 음..

gcc 에서.. 컴파일시에.. 스택구조에 따라.. .s 를

다르게 출력하더라구요?..

-mpreferred-stack-boundry= 라는 옵션으로..

스택구조를 지정하는거 같은데..

음.. 근데.. 어셈은 cpu 에 의존적인거 아닌가요?

같은 시피유에서도 스택구조가 바뀔수도있나요?

컴파일러에 옵션이 있으니까 당연히 바뀌껫지만-_-

왜 바뀔수 있는지 궁금하네요..

음 그리고 이러한 스택구조에 관한 문서는 어떤걸 참조하면될까요? @.@

버려진의 이미지

오버플로우에 의한 보안 취약점을 보완하기 위해 바뀝니다.

gcc의 경우 2.95이후부터 확 바꼈던걸로 기억을 합니다.

만약에

int main()
{
    int i;
    return 0;
}

이런 코드는 예전에는

.globl main
    .type main, @function
main:
    pushl %ebp
    movl %esp, %ebp
    subl $4, %esp
....생략

이런 식이었지만, gcc 3.x이라면

.globl main
    .type main, @function
main:
    pushl %ebp
    movl %esp, %ebp
    subl $16, %esp
....생략

이런식이 됐습니다.

물론 사용할때는 상대주소로 별 신경 안쓰고 사용하면 됩니다.

로컬이라면 몰라도 리모트 오버플로우 공격에는 더 안전할 수 있습니다.

다른 이유가 또 있는지는 모르겠습니다 :)

(컴파일러에 따른 스택 변화만 언급했습니다)