시스템 해킹

 1576, 1/79 회원가입  로그인  
   suij403
   char 메모리 저장 질문입니다.

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1662 [복사]


대학교>시스템해킹> 버퍼오버플로우- 기초
강좌 보고있는 컴맹입니다.

강좌를 보면 버퍼오버플로우라의 원리를 익히는 차원에서
간단한 문제를 내거든요.
(문제에 대한 질문이 아니니까 가볍게 봐주세여)

#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);
}

이 프로그램을 실행할 때 전달하는 문자열을 이용해
CAT이 출력되도록 하는건데

$ ./ex1 AAAAAAAAAAAAAAAAAAAACAT
0xbffffb10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0xbffffb20 00 00 00 00 44 4f 47 00 ....DOG.
[*] BEFORE : the value of target is DOG
0xbffffb10 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0xbffffb20 41 41 41 41 43 41 54 00 AAAACAT.
[*] AFTER : the value of target is CAT
$
답은 이거고요.


제가 질문할건 문제에 관한게 아니라 char 형의 메모리 저장방식인데


이 부분 뒤에 나오는 스택메모리구조 설명 보면
스택은 단위가 4바이트라서 char형 같이 4바이트보다 적은 자료형은
부족한 부분은 그냥 냅둔다?고 하더라고요.

예를 들어
char a=5면
[.. .. .. 05]
이렇게요  (..은 쓰레기값)

그런데 다시 앞부분, 그러니까 위의 문제를 보면
char buf[20]을 선언했는데
메모리에 저장되있는 상태는
1바이트가 20개 나열되있단 말이에요??  [00 00 00 00 00 00 .. 00]

스택 메모리 설명에 나오는 대로라면

char buf[20]={0} 이라고 햇을때
             buf[0]                     buf[1]                 buf[2]
0x...  [.. .. .. 00]               [.. .. .. 00]              [.. .. ..00]
                 ↑실제값                ↑실제값             ↑실제값
이렇게 메모리를 보면 4바이트를 차지해야 하는거 아닌가요?
실질적으로 배열의 실제 값은 각 맨뒤 바이트고요.
나머지는 그냥 채워지는 값.
위에 설명에 나온대로 말이죠.


제 질문은 이렇습니다.
이해가 가실지가 걱정입니다.

이해가 안가는 부눈 말해주시면
설명해드리겟습니다.


  Hit : 4133     Date : 2013/04/05 08:34



    
kumi123 4바이트형 같은 경우에 0x12345678 이라고하면, 리틀에디안으로 인해 메모리에 78 56 34 12 로 저장이되고
2바이트형은 0x1234 은 34 12 지만
1바이트형 같은 경우에는, 바뀔꼐 없어서 그냥 0x12 에서 0x12로 그대로 써요
2013/05/20