-
[HackerSchool] Level9오래된/HackerSchool 2011. 4. 28. 01:07
[level9@ftz level9]$ cat hint
다음은 /usr/bin/bof의 소스이다.
#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");
}
}이를 이용하여 level10의 권한을 얻어라.
[ level9 hint ]
bufferoverflow 공격을 이해하기 위한 문제이다.
1. Buffer Overflow
buffer overflow 는 말 그대로 Buffer 가 넘쳐 흐르는 것이다. 여기서 말하는 Buffer 는 문자열이 저장되는 메모리 공간을 의미 한다.
그럼 무엇이 문제인지 확인해 보겠다.
char buf2[10];
char buf[10];
printf("It can be overflow : ");
fgets(buf,40,stdin);
if ( strncmp(buf2, "go", 2) == 0 )
buf 에서 할당한 메모리 공간은 10 byte 밖에 되지 않는데, fgets 함수를 이용해서 buf 배열에 40 byte 를 채우고 있다.
이렇게 되면 10 byte 는 buf 메모리 공간에 채워지고 나머지 30 byte 는 그대로 그 이후 메모리 공간에 채워지게 된다.
만약 그 영역이 buf2 배열 메모리 공간이라고 할지라도.
#include <stdio.h>
int main(void)
{
char buf2[10];
char buf[10];fgets(buf, 40, stdin);
printf("buf2 : %s\n", buf2);
}
[level9@ftz tmp]$ gcc -o test test.c
[level9@ftz tmp]$ ./test
AAAAAAAAAAAAAAAAAAAA
buf2 : AAAA
비슷한 프로그램을 만들어 간단히 테스트 해보면 buf 에 입력된 값이 buf2 로 넘쳐 흘러 들어감을 확인해 볼 수 있다.
그런데, 문자는 20 개를 넣었는데 buf2 에는 4개의 문자만 출력되었다. 계산대로라면 buf 에 10개 buf2 에 10개가 들어가야 하는데 말이다.
첫 번째, 컴파일러는 1 byte 의 메모리 공간을 요청했다고 할지라도 4 byte 공간( 4의 배수 )을 요청 하도록 기계어 코드를 작성한다.
두 번째, 너무 buffer overflow 공격이 많아지고 exploit code 들이 넘쳐남에 따라 컴파일러에서 임시방편으로 각 buffer 사이에 dummy 영역을 넣도록 했다. 처음에는 4 byte를 넣도록 했고, 이후에는 랜덤한듯한(?) 크기로 넣는데, bof 프로그램의 경우 4 byte 의 dummy 영역이 존재한다.
결국 buf 와 buf2 사이의 거리는 16 byte 이고, 우리가 입력한 20 byte 중 12 byte는 buf 에 4 byte 는 dummy 영역에 그리고 남은 4 byte 만 buf2 에 들어가게 된 것이다.
'오래된 > HackerSchool' 카테고리의 다른 글
[HackerSchool] Level11 (0) 2011.04.29 [HackerSchool] Level10 (0) 2011.04.29 [HackerSchool] Level8 (0) 2011.04.27 [HackerSchool] Level7 (0) 2011.04.27 [HackerSchool] Level6 (0) 2011.04.27