어셈 질문입니다.
글쓴이: 살자 / 작성시간: 목, 2004/04/22 - 3:03오후
안녕하세요..
제가 지금 어셈을 공부하는 초보 인데여..
궁금한것이 있어서 이렇게 질문 드립니다..
고수님들의 많은 조언 부탁드립니다.
c code를 gcc -S -o t.s t.c 를 사용하여 어셈으로 만들었는데여...
#include <stdio.h> int main() { }
asm code
.file "t.c" .text .align 2 .globl main .type main,@function main: pushl %ebp movl %esp, %ebp //////////////////////////////////////////////////// subl $8, %esp andl $-16, %esp movl $0, %eax /////////////////////////////////////////////////// subl %eax, %esp leave ret .Lfe1: .size main,.Lfe1-main .ident "GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)"
표시된 부분의 코드가 이해가 되질 않습니다..
어떤 작업을 하는 코드인지.. main 함수가 들어간 코드에만 저렇게 나오는데..
잘 이해가 가질 않습니다...
그럼 미리 감사 합니다....
Forums:
subl $8, %esp는 8 byte 만큼 로컬 변수를 위한 공간을
subl $8, %esp
는 8 byte 만큼 로컬 변수를 위한 공간을 확보하라는 것이구요.
andl $-16, %esp 는 %esp 값을
11111111 11110000 으로 마스킹한 값을 취하라는 것인데, 즉 address alignment를 16의 배수로 하라는 것이 되겠네요.
그 다음줄은 eax에 0을 넣으라는 얘기군요. 대개 int 형을 돌리는 함수의 return 값을 전달할 때 쓰입니다.
---
http://coolengineer.com
Programming from the ground 란 책을 ( 온라인 p
Programming from the ground 란 책을 ( 온라인 pdf 문서도 있습니다. ) 보시면 많은 도움이 될듯 한데..음.. 정말 좋더라구요. ( 전 책으로 구매했다는..히히.. )
gcc 에선 기본적으로 스택오버플로 방지를 위해 저렇게 주소를 미는 거라고 들었는데요.. ( 저도 질문이 되는거같습니다. 제가 알고 있는게 정확한지 궁금해서요 ^^; )
-mpreferred-stack-boundary=2 옵션으로 주고 컴파일 해보시면 저렇게 스택을 밀어주는 어셈 코드가 사라집니다.
---------------------------------------------------------------------------
http://jinhyung.org -- 방문해 보세요!! Jenix 의 블로그입니다! :D
음... 스택을 미는 거라뇨?[code:1] subl $8
음... 스택을 미는 거라뇨?
이거 말씀하시는건가요?
스택에 ret어드레스랑 ebp가 저장되고 난 후에 8씩
빼 주는건 메모리 alignment를 16바이트로 맞춰줬을때
일반적인 function의 처음에 항상 나오는 걸로
알고 있는데...
그래야 ret어드레스 4바이트, ebp 4바이트, 그리고 8바이트로
16바이트 alignment가 맞춰지잖아요.
앞의 코드 보니 왠지 andl $-16, %esp 랑 중복되는거 같아서
이상하긴 하지만 아무튼 그런 이유로 알고 있습니다.
인텔의 몇몇 인스트럭션의 경우가 16바이트로 맞춰줬을때
가장 빠르게 돌아간다고 해서 그런 걸로 알고 있고요.
사실 저렇게 미는걸로 스택 오버플로우 공격같은걸
막는건 눈가리고 아웅하기 식일텐데요;
저도 잘 몰라서... 자세히 아시는분 안계신가요? :)
http://home.postech.ac.kr/~sodomau
음..집에 와서 찾아보니까..오버플로우 막는건 아니군요 -_-;;
음..
집에 와서 찾아보니까..
오버플로우 막는건 아니군요 -_-;; ( 죄송; )
음.... 확실한건..
gcc 에서 사용하는 스택구조가 2.95 이후로 변경되었다는데..
-mpreferred-stack-boundary=2 옵션은.. 2.95 이전의 스택 구조를 사용하기위함이라는 군요 ^^;
( 잘못 알고있었네요.. 죄송 ^^; 하나 더 배워갑니다. )
---------------------------------------------------------------------------
http://jinhyung.org -- 방문해 보세요!! Jenix 의 블로그입니다! :D
댓글 달기