오버플로우관련된 소스에서 질문입니다.

okgo의 이미지

리눅스를 컴퓨터에 설치하고보니 마땅히 명령어 연습할것도 없고 해서 재미있게 배우는 방법으로 해커스쿨이라는데서 레벨뚫기를 해보면서 배워보려고 합니다. 뚫는다는것보다는 명령어나 시스템활용을 배운다는 취지죠....그냥 지겨울때마다...그런데 누가 그곳 질문계시판에 질문한 내용이 있는데 마땅한 답변이 없더군요.
이곳에서는 시원한 답변을 들을수 있을것 같아서 퍼와 봤습니다.

문제 소스
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main(){

  char buf2[10];
  char buf[10];

  printf("It can be overflow : ");
  fgets(buf,40,stdin);

  if ( strncmp(buf2, "go", 2) == 0 )
   {
        printf("Good Skill!\n");
        setreuid( 3010, 3010 );
        system("/bin/bash");
   }

}

여기서 
main(){

  char buf2[10];
  char buf[10];
여기까지의 스택의 구조를 본다면

데이터 이름 [buf] [buf2] [SFP] [RET]
데이터 크기 [10 ] [ 10 ] [ 4 ] [ 4 ]

아닌가요?
그럼
  if ( strncmp(buf2, "go", 2) == 0 )
여기서 buf2의 첫2바이트 에 go 가 들어가면 되니까
buf에 10바이트를 체우고 그다음에 go
그러니까 "10byte+go" 이렇게 입력하는거 아닌가요?
(예 : it can be overflow : 1234567890go)

아님, fgets 가 실행될때까지의 스택구조를 보는건가요?
그럼 fgets함수가 실행될때 스택구조를 어떻게 이용하나요;;;

도대체 왜~ 16바이트 다음에 go를 집어넣어야 하는지-ㅅ-
 

위의 질문중 마지막에
도대체 왜~ 16바이트 다음에 go를 집어넣어야 하는지-ㅅ-
부분이 저도 궁금합니다.
이곳에서는 시원한 해답을 얻을수 있겠지요?

매맞는아이의 이미지

gcc 2.96 이상의 버젼에서는 컴파일시..더미값이 들어갑니다..
그래서 buf2에 제대로 "go"가 들어가지 않는거죠..

위에 보면 BOF에 대해 잘못 알고 계신 부분도 있는 듯..;;;

여기 가보시면 도움되실 겁니다..

http://hackerleon.cybersoldier.net/next-board/board.cgi?db=hack&mode=read&num=36&page=1&ftype=6&fval=&backdepth=1

내가 그린 원 안에서.. 난 서 있겠지.. 언제까지나..

okgo의 이미지

음 ~~~~~대충봤는데...
초짜의 허접한 추측으로는... 고의로 오버프로우에 대비하여 중간에 더미값이 들어가도록 만든것인가보죠?

ssehoony의 이미지

16바이트인가요? 12바이트가 아니고?
12바이트라고 한다면 원래 32 비트 컴에서는 4바이트 단위로
메모리 정렬 (memory alignment ) 가 발생합니다.
구조체가 그런것 처럼 스택도 그렇게 하지요.
그래서 그렇다고 볼 수 있을 듯 한데.. 16 바이트인가요?
음.. 왜 그런지 궁금하네요.

jyj9782의 이미지

더미라자나요..
12바이트 정렬하고.. 더미가 4바이트 붙었나보죠

힘내세요.

advanced의 이미지

스택의 크기에 따라 일관된 크기가 할당되는것은 아닌듯 싶습니다

http://www.trapkit.de/papers/gcc_stack_layout_v1_20030830.pdf

이 문서 보시면...

stack 의 크기에 따라 변하는 stack 할당 크기가 자세히 설명되어있습니다.

한글이나 영어는 아니지만 그림이나 소스로도 충분히 의미가 전달될 것 같네요

- advanced -

매맞는아이의 이미지

main(){ 

  char buf2[10]; 
  char buf[10]; 

  printf("It can be overflow : "); 
  fgets(buf,40,stdin); 

  if ( strncmp(buf2, "go", 2) == 0 ) 
   { 
        printf("Good Skill!\n"); 
        setreuid( 3010, 3010 ); 
        system("/bin/bash"); 
   } 

} 

[buf][buf2]..
[12 ][ 12 ]..
원래는 이런식으로 나가는게 맞죠..

2.96이상에서는..

[buf][dummy][buf2]..
[12 ][ 4 ][ 12 ]..

이런식으로 됩니다..

소스가 복잡해질수록..
더미값들이 많이 붙어서 메모리 구조를 파악하기 힘들게 되죠..

허나 더미값들도 어느정도 패턴을 가지고 있기 때문에 그 패턴을 바탕으로.. 공격이 이루어지죠..
아니면 무한 삽질로....;;;;;;

내가 그린 원 안에서.. 난 서 있겠지.. 언제까지나..

ssehoony의 이미지

그렇다면 더미를 넣는 이유는 뭘까요?
이유가 있을 것 같은데.... 그냥 생각해 봐서는 특별히 장점을 모르겠네요.

정태영의 이미지

더미라기 보다..

메모리 접근 단위가 x86은.. 16,32 단위가 아니던가요 +_+?
워드에서.. 왼쪽 16비트.. 오른쪽 16비트 단위로도 읽을수 있고..
그냥 워드 단위로 읽을수도 있고..

그래서 16의 배수로 메모리가 할당되지 않는건가 싶습니다 =3=33

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

ssehoony의 이미지

위에 이야기가 있는데요
10바이트 버퍼면 32 비트 컴에서는 12바이트로 memory alignment 가 발생하는건 이해가 가는데요. gcc 에서는 왜 16 바이트로 생성이 되는건지. 그걸 모르겠네요.
위에 Advanced 라는 분이 가르쳐주신 자료는 봐서는 저는 쉽게 이해가 가질 않네요

댓글 달기

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