gcc 4.1.2 상에서의 dummy바이트
글쓴이: bjgangs / 작성시간: 토, 2009/09/12 - 2:27오후
질문이 있어서 이렇게 글올립니다.
제가 알기로는 gcc 2.96상위버전에서는 스택에 할당되는 버퍼의 크기를 16바이트 단위로 할당하고
뒤에 이어서 8바이트의 dummy바이트를 추가하는 것으로 알고 있습니다.
예를 들어
char buf[10];
char buf2[10];이라면
[ret][sfp][dummy8바이트][6바이트+buf 10바이트][4바이트 + buf2 12바이트]
이렇게 되는것으로 알고 있는데요
gcc 3.2.2에서 테스트 했을 경우 정상적으로 위와같이 나오는데요
gcc 4.1.2에서 테스트 했을 경우 위와같이 나오지를 않는데
4.1.2버전에서는 dummy바이트 주는방식에 변화가 생긴건가요?
소스코드입니다.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> } main(){ char buf2[10]; char buf[10]; printf("It can ge overflow : "); fgets(buf, 40, stdin); if(strncmp(buf2, "go", 2) == 0) { printf("Good Skill!\n"); setreuid(3010, 3010); system("/bin/bash"); } }
gcc 4.1.2로 컴파일한 파일을 gdb를 이용한 어셈블코드입니다.
0x080484b4 <main+0>: lea 0x4(%esp),%ecx 0x080484b8 <main+4>: and $0xfffffff0,%esp 0x080484bb <main+7>: pushl 0xfffffffc(%ecx) 0x080484be <main+10>: push %ebp 0x080484bf <main+11>: mov %esp,%ebp 0x080484c1 <main+13>: push %edi 0x080484c2 <main+14>: push %esi 0x080484c3 <main+15>: push %ecx 0x080484c4 <main+16>: sub $0x3c,%esp 0x080484c7 <main+19>: movl $0x8048630,(%esp) 0x080484ce <main+26>: call 0x80483a4 <printf@plt> 0x080484d3 <main+31>: mov 0x80497e0,%eax 0x080484d8 <main+36>: mov %eax,0x8(%esp) 0x080484dc <main+40>: movl $0x28,0x4(%esp) 0x080484e4 <main+48>: lea 0xffffffe0(%ebp),%eax 0x080484e7 <main+51>: mov %eax,(%esp) 0x080484ea <main+54>: call 0x8048384 <fgets@plt> 0x080484ef <main+59>: lea 0xffffffea(%ebp),%eax 0x080484f2 <main+62>: mov %eax,0xffffffd0(%ebp) 0x080484f5 <main+65>: movl $0x8048646,0xffffffcc(%ebp) 0x080484fc <main+72>: movl $0x2,0xffffffc8(%ebp) 0x08048503 <main+79>: cld 0x08048504 <main+80>: mov 0xffffffd0(%ebp),%esi 0x08048507 <main+83>: mov 0xffffffcc(%ebp),%edi 0x0804850a <main+86>: mov 0xffffffc8(%ebp),%ecx 0x0804850d <main+89>: repz cmpsb %es:(%edi),%ds:(%esi
strncmp()부분까지만 캡처한 내용이구요
처음부분에 왜 스택을 3c나 할당하는지 모르겠습니다.
그리고 buf2같은 경우 위에대로라면 ebp에서 22바이트 떨어진곳이 시작주소로 보이는데
그렇게 되면 buf나 buf2 모두 10바이트씩만 할당받은것이지요?
그리고 buf나 buf2모두 시작주소가 ebp로부터 4바이트단위로 딱딱 떨어지는 주소가 아닌데요..
제가 잘못이해하고 있는건가요?
조언부탁드립니다.~
Forums:
x86, x86-64
x86, x86-64 ABI에서는
16byte 미만의 array는 element 의 alignment를 따르도록 정의된 것으로 압니다.
char의 경우 1-byte alignment구요.
아마 다른 여러 아키텍처에서도 보통 그렇게 정의하는 듯 합니다.
성능을 희생하긴 했으나 조금 더 표준에 맞게 바뀌었다고 볼 수 있겠습니다.
GCC는 major version change에서 표준을 더 강조하는 경향이 있어 왔는데...
덕분에 포팅 삽질을 한아름씩 안겨준다는.. -_-;
댓글 달기