반응형
[FTZ] level9
level9으로 접속해서 hint를 읽었더니 /usr/bin/bof 소스가 나왔다.
파일 제목부터 bof 로 buffer overflow를 이용해야 하는 문제이다.
#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");
}
}
fgets을 통해사 입력값을 받아 buf에 저장하고
strncmp 함수로 buf2 가 "go"일때 문제가 해결됨.
str : 읽어들인 문자열을 저장할 char 배열을 가리키는 포인터char* fgets(char* str, int num, FILE* stream);
num : 마지막 NULL 문자를 포함하여 읽어 들일 최대 문자수
stream : 문자열을 읽어드릴 스트림의 FILE 객체. 특히 표준입력(stdin)에서 입력을 받으려면 stdin을 적으면 된다.
위의 코드를 보면 buf의 크기가 10이지만 fgets 함수를 보면 40바이트까지 입력이 가능하다.
이 부분이 취약한 거 같다.
Stack 구조를 그리면
이렇게 되는데 fgets 함수가 실행되면서 buf에 입력값이 채워지는데
이 입력값을 원래 크기(10) 보다 크게 입력하여 buf2의 값을 "go"로 바꾸는 게 목표이다.
처음에는
이렇게 생각을 해서 a이 10번에 go를 붙여서 입력을 했지만 아니였다.
인터넷을 찾아보니까 메모리 공간을 할당할 때 Full Word Boundary에 맞추서 8의 배수로 할당이 된다고 한다.
그래서 buf, buf2는 10 bytes이므로 8의 배수를 할당하기 위해서 16bytes가 할당되고 그중에서 6bytes는 사용되지 않는 공간이 된다고 한다.
그러면 아래와 같이 스택구조가 되기 때문에
앞에 buf 10byte와 dummy 6bytes 그리고 buf2에 go를 넣으면 성공하게 된다.
이제 my-pass 명령어를 넣으면 level10의 비밀번호를 알 수 있다.
Reference : https://grayfieldbox.tistory.com/entry/FTZFree-Training-Zone-Level-09
반응형