[완료] 지역 변수 스택 할당 위치에 관한 질문

karkayan의 이미지

안녕하세요,

과제로 버퍼 오버플로우를 하기 위해서 변수 주소들을 살펴보다가 조금 이해가 안가는 걸 보았습니다.

일단 코드는

void check(char *arg)
{
    char passwd[64];
    strcpy(passwd, arg);
    ...


형태로 되어있습니다. 처음 생각으로 스택이 char [64] 배열, ebp, return address 형태로 구성되어 있어서 입력으로 72byte를 보내면 return address를 조작할 수 있을거라고 생각했는데 실제로는 8byte가 더 필요하더군요. 그래서 보았더니 char [64] 배열과 ebp 사이에 어떤 8byte 공간이 더 들어가서 실제로는 스택 구조가 char [64] 배열, 8byte, ebp, return address 형태로 구성이 되어있더군요. 저기 8byte 공간의 값을 모니터링 해 보았는데, 값이 전혀 안 바뀌는 걸로 봐도 그리고 어셈블리 코드를 살펴봐도 사용되지 않는 공간인 거 같은데요.

저 8byte의 공간은 왜 생기는 것인가요? 저 공간의 크기에 대한 규칙 같은게 있는 건가요?

alignment에 대해서도 생각해 봤는데, 8byte 공간이 추가되는 거니까 4byte align, 8byte align 때문에 발생할 것 같지는 않고,
남는건 16byte align인데, 이건 x86의 sse 관련해서만 사용되는 거 같더군요.

alignment도 아니라면 저 공간은 대체 무슨 공간일까요?

jick의 이미지

http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html

gcc 관련문서를 찾아보니 요즘 버전은 디폴트가 16바이트 align인 것 같습니다.

-mpreferred-stack-boundary=num
Attempt to keep the stack boundary aligned to a 2 raised to num byte boundary. If -mpreferred-stack-boundary is not specified, the default is 4 (16 bytes or 128 bits).

karkayan의 이미지

감사합니다.
저 옵션으로 align을 줄이니 빈 공간이 사라지는 군요. 아마 이것 때문인것 같습니다.
인터넷에서 align으로 검색해봐도 죄다 int는 4byte align, char는 1byte align 식으로 나와있어서 align이 아닐꺼라고 생각해버렸네요.

jick의 이미지

각각의 변수의 align과 스택의 align은 좀 개념이 다릅니다.

16바이트 정렬이 필요한 변수가 있다면, 이 변수를 스택에 제대로 넣기 위해선 함수를 시작할 때 스택 시작 주소가 16바이트로 정렬이 되어 있어야 하겠죠. 자기가 부르는 하위 함수에서 어떤 변수를 쓸지 모르기 때문에, 자기가 쓰는 변수는 4바이트 정렬로 충분하다고 해도 스택프레임은 16바이트 정렬을 맞추는 거죠.

lovian의 이미지

최근 컴파일러들은, 기본 옵션으로, 스택가드가 들어가는 것으로 알고 있습니다.
그에 따른 더미 데이터일 수도 있다는 생각이 드네요.
컴파일 옵션을 더 확인해보시는건 어떨까요?

-----------------
한글을 사랑합니다.

karkayan의 이미지

감사합니다.
아마 그것때문에 교수님이 숙제 머신을 일부러 구버전으로 준비해 주셨나 봅니다.
gcc가 2.96버전이네요. wikipedia에 찾아보니 4.1이후로 gcc에 스택가드가 포함되는 것 같습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.