gcc 4.1.2 상에서의 dummy바이트

bjgangs의 이미지

질문이 있어서 이렇게 글올립니다.

제가 알기로는 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바이트단위로 딱딱 떨어지는 주소가 아닌데요..
제가 잘못이해하고 있는건가요?

조언부탁드립니다.~

prio의 이미지

x86, x86-64 ABI에서는
16byte 미만의 array는 element 의 alignment를 따르도록 정의된 것으로 압니다.
char의 경우 1-byte alignment구요.
아마 다른 여러 아키텍처에서도 보통 그렇게 정의하는 듯 합니다.

성능을 희생하긴 했으나 조금 더 표준에 맞게 바뀌었다고 볼 수 있겠습니다.

GCC는 major version change에서 표준을 더 강조하는 경향이 있어 왔는데...
덕분에 포팅 삽질을 한아름씩 안겨준다는.. -_-;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.