프로그래밍

 3198, 1/160 회원가입  로그인  
   relilau
   http://relilauhome.tistory.com
   gcc 4.4.5에서 어셈블리어 질문

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3154 [복사]


제가

int main()
{
write(1, "Hello, Students!\n", 17);
}

이런 코드를 페도라14에서 gcc 4.4.5에서 컴파일 했습니다.
이를 gdb로 디스어셈블을 해봤더니

   0x00000000004003f4 <+0>:        push   %rbp
   0x00000000004003f5 <+1>:        mov    %rsp,%rbp
   0x00000000004003f8 <+4>:        mov    $0x6,%edx
   0x00000000004003fd <+9>:        mov    $0x46fc50,%esi
   0x0000000000400402 <+14>:        mov    $0x1,%edi
   0x0000000000400407 <+19>:        mov    $0x0,%eax
   0x000000000040040c <+24>:        callq  0x40c560 <write>
   0x0000000000400411 <+29>:        leaveq
   0x0000000000400412 <+30>:        retq  

이렇게 나왔습니다. 그런데 해커스쿨 강좌에서 보니까(같은 코드)

0x80481e0 <main>:       push   %ebp
0x80481e1 <main+1>:     mov    %esp,%ebp
0x80481e3 <main+3>:     sub    $0x8,%esp
0x80481e6 <main+6>:     sub    $0x4,%esp
0x80481e9 <main+9>:     push   $0x11
0x80481eb <main+11>:    push   $0x808ce68
0x80481f0 <main+16>:    push   $0x1
0x80481f2 <main+18>:    call   0x804ccf0 <write>
0x80481f7 <main+23>:    add    $0x10,%esp
0x80481fa <main+26>:    leave
0x80481fb <main+27>:    ret

이런식으로 나옵니다. 비교해보니까 처음 시작에서 해커스쿨에서는 push %ebp인데 전 push %rbp였습니다.
ret도 retq로 바뀌어나옵니다.
write 함수에서 인자를 전해주는 것도 push가 아닌 mov 고요..

gcc버전이 바뀜에 따라서 이렇게 된 것일까요??
이 상태로 그냥 BOF 배우는 게 나을까요??(생초보입니다. 원리만 알고 어떻게 해야되는지는 모릅니다.)
gcc를 다운그레이드하고 쓸까요?



  Hit : 5386     Date : 2011/09/02 11:33



    
$Zero 64비트가 되면서 레지스터의 종류가 추가되고 확장되었습니다.

ebp역시 16에서 32비트로 확장되면서 생긴 레지스터이고

rbp역시 ebp에서 64비트가 되면서 확장된 레지스터입니다.

64비트 리버싱은 좀 생소한 부분이 많으니 문서를 하나 참고하심이 좋을 듯 합니다.
2011/09/03  
$Zero 생겼다는 말보단 확장됐다는 말이 정확한 표현이니 혼돈 없으시길.

bp - > ebp - > rbp

이렇게 확장된 것입니다.
2011/09/03