님들 

제가 해커스쿨로 버퍼오버플로우 공부를 하고 있는데 이해가 잘안되서요... 일단


-----------------------------------------------------------------------------

#include “dumpcode.h”

int main(int argc, char *argv[])

{

 char target[4] = “DOG”;

 char buffer[20] = {0, }; // 0으로 초기화

 if(argc < 2)

 {

 printf(“argument error\n”);

 exit(-1);

 }

 // dumpcode로 메모리 덤프

 dumpcode(buffer, 24);

 printf(“[*] BEFORE : the value of target is %s\n\n”, target);

 // 첫 번째 인자로 전달된 문자열을 buffer로 복사

 // 여기서 buffer overflow 발생!

 strcpy(buffer, argv[1]);

 // dumpcode로 메모리 덤프

 dumpcode(buffer, 24);

 printf(“[*] AFTER : the value of target is %s\n”, target);

}

---------------------------------------------------------------------------


결과는


---------------------------------------------------------------------------

$ ./ex1 abc

0xbffffb20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0xbffffb30 00 00 00 00 44 4f 47 00 ....DOG.

[*] BEFORE : the value of target is DOG

0xbffffb20 61 62 63 00 00 00 00 00 00 00 00 00 00 00 00 00 abc.............

0xbffffb30 00 00 00 00 44 4f 47 00 ....DOG.

[*] AFTER : the value of target is DOG

----------------------------------------------------------------------------



이건데 .... 제가 궁금한 것은 target변수 위치가 왜 buffer보다 뒤 쪽에 있는지 모르겠습니다.. 기초인거같은데 이해가 안되네요 ㅠㅠ 

크기가 작은 변수는 뒤쪽으로 가나?



dumpcode헤더파일은 메모리 주소를 보여주는 코드입니다.

혹시  dumpcode.h의 영향이 있을까봐 같이 적어보겠습니다.



--------------------------------------------------------------------

void printchar(unsigned char c)

{

 if(isprint(c))

 printf(“%c”,c); // 해당하는 값을 문자로 표시

 else

 printf(“.”); // 출력 불가능한 문자는 그냥 .으로 표시

}

// 메모리 시작 주소와 출력할 크기를 인자로 받음

void dumpcode(unsigned char *buff, int len)

{

int i;

for(i=0;i<len;i++)

{

// 16바이트 단위로 주소 출력

if(i==0)

printf(“0xx “,&buff[i]);

// hex 값 출력

printf(“x “,buff[i]);

// 해당 16진수들을 각각 문자로 출력

if(i-15==0) 

{

int j;

printf(“ “);

for(j=i-15;j<=i;j++)

printchar(buff[j]);

printf(“\n”);

}

}

// 마지막 라인이 16바이트 이하일 경우 정렬 유지

if(i!=0)

{

int j;

int spaces=(len-i+16-i)*3+2;

for(j=0;j<spaces;j++)

printf(“ “); // 부족한 공간만큼 space로 이동한 후,

for(j=i-i;j<len;j++)

printchar(buff[j]); // 남은 문자 값들 출력

}

printf(“\n”);

-----------------------------------------------------------------------------


딱히 물어볼 곳이 없어서 여기다 적어봅니다. ㅠ