Information Security Study
[HackerSchool_FTZ] Level 9 본문
힌트로 /usr/bin/bof 의 소스코드를 받았다.
먼저 코드를 보면 bur, buf2를 char형 배열로 10개를 할당한다.
buf2를 먼저 할당해줬기 때문에 buf2는 buf보다 더 높은 주소를 가지게 된다.
이후, 'It can be overflow : '문자를 출력한 다음 fgets로 buf에 40byte 만큼 입력을 받는다.
이때 할당된 buf 배열보다 더 많은 입력값을 받기 때문에 버퍼오버플로우가 발생한다.
버퍼 오버 플로우(Buffer OverFlow)
: 시스템 해킹의 대표적인 공격 방법 중 하나이다.
데이터가 지정된 크기의 공간보다 더 많은 입력을 통해 해당 메모리 공간을 벗어나는 경우이다.
프로그래밍 언어와 취약한 함수가 있는 경우 이를 이용해 공격을 시도하며 공격이 성공할 경우 시스템의 권한을 상승시키거나 악성 행위를 할 수 있기 때문에 공격에 대한 방어를 철저히 해야한다.
버퍼 오버 플로우가 발생하면 입력은 buf에 받지만 그 메모리 공간을 벗어나는 입력을 했을 경우 buf2의 값까지도 영향을 줄 수 있다.
strncmp 함수를 통해 buf2의 값과 "go"라는 문자열의 2byte를 비교하게 된다.
비교하는 값이 같다면 strncmp 함수는 0을 반환하게 된다.
-> 0과 같다면 다음 레벨의 권한을 부여하고 shell을 실행시켜 level10의 권한을 얻게 된다.
데이터 입력은 낮은주소에서 높은주소로 입력되기 때문에 만약 buf가 buf2보다 먼저 선언되었다면 buf에서의 입력으로 buf2에 영향을 줄 수 없다.
buf의 10byte를 채워주고 buf2의 첫영역부터 "go"를 입력해보았다.
아무것도 일어나지 않았다.
컴파일 되는 과정에서 자동으로 buf와 buf2 사이에 dummy 값이 생성된다.
이를 알기 위해 실행파일을 GDB라는 디버깅 툴을 이용해 분석했다.
GDB
: 보통은 GDB라고 부르는 GNU 디버거(GNU Debugger)는 GNU 소프트웨어 시스템을 위한 기본 디버거이다.
GDB는 다양한 유닉스 기반의 시스템에서 동작하는 이식성이 있는 디버거이며 컴퓨터 프로그램의 실행을 추적하고 수정할 수 있는 많은 기능들을 제공한다.
권한이 없는 것 같아 실행파일을 복사해서 분석했다.
복사도 안되는 것 같아 힌트파일의 소스코드를 통해 직접 컴파일했다.
./tmp 파일로 들어가서 소스코드를 컴파일해야 한다. (tmp디렉터리 안에 파일이 생성 가능)
vi를 통해 소스코드를 붙여넣고 gcc를 통해 컴파일했다.
프로그램이 잘 동작했다.
다시 gdb를 실행했다.
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");
}
}
소스코드를 보면
먼저 fgets 함수를 실행할 때 buf의 주소를 인자로 사용하게 된다.
fgets(buf,40,stdin);
0x0804844b <main+43>: lea eax,[ebp-40]
0x0804844e <main+46>: push eax
fgets 함수 사용 전 인자로 buf 주소를 push해주는 과정
-> ebp-40 주소 값을 가지고 있는 것을 알 수 있다.
strncmp(buf2, "go", 2)
0x08048461 <main+65>: lea eax,[ebp-24]
0x08048464 <main+68>: push eax
strncmp 함수 사용 전 인자로 buf2 주소를 push 해주는 과정
-> ebp-24 주소 값을 가지고 있는 것을 알 수 있다.
buf: ebp-40
buf2: ebp-24
-> buf와 buf2의 거리는 16byte
buf(10)와 buf2(10) 사이의 dummy 값은 6byte인 것도 알 수 있다.
-> buf에서 16byte 넘게 입력받으면 buf2의 값을 변조할 수 있다.
q 명령어를 통해 gdb를 종료하고 실행해봤다.
buf2에 "go"값이 잘 입력됐다!
원본 파일에 입력했다.
level10의 계정으로 로그인 된 것을 볼 수 있다.
my-pass로 패스워드를 확인했다.
참고 자료
[HackerSchool] FTZ Level9 풀이
FTZ LEVEL9부터 버퍼 오버 플로우 지식을 기초로 하는 문제가 등장합니다. 기초가 없으신 분들은 아래 링크에 달고나님의 문서를 올려두었습니다. https://she11.tistory.com/23 쭉 읽으면서 공부하시면 좋
she11.tistory.com
'System' 카테고리의 다른 글
[HackerSchool_FTZ] Level 7 (0) | 2023.11.12 |
---|---|
[HackerSchool_FTZ] level 10 (0) | 2023.11.09 |
[HackerSchool_FTZ] level6 (0) | 2023.10.08 |
[HackerSchool_FTZ] level5 (0) | 2023.10.08 |
[HackerSchool_FTZ] level4 (0) | 2023.10.01 |