|
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
|