War Game/CTF

[SCTF 2023] BOF101 - writeup

ReTeu 2023. 8. 22. 10:57

Hackers' Playground로 명칭이 변경되었지만, 익숙한 SCTF 명칭으로 사용하도록 하겠다.

간단한 Stack Buffer Overflow 문제이다. scanf, strcpy와 같이 사용자로부터 입력받은 값을 변수에 저장할 때에, 값을 저장하는 변수의 가용 공간을 고려하지 않고 사용자의 입력값 전체를 대입하는 과정에서 할당받은 범위를 벗어나 그 이후의 영역에까지 값을 작성해버리는 취약점이다. 먼저 코드를 살펴보도록 하자.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

void printflag(){ 
	char buf[32];
	int fd = open("/flag", O_RDONLY);
	read(fd, buf, sizeof(buf));
	close(fd);
	puts(buf);
}

int main() {
	int check=0xdeadbeef;
	char name[140];
	printf("printflag()'s addr: %p\n", &printflag);
	printf("What is your name?\n: ");
	scanf("%s", name);	
	if (check != 0xdeadbeef){
		printf("[Warning!] BOF detected!\n");
		exit(0);
	}
	return 0;
}

위의 코드를 참고하여 스택 레이아웃을 그리면 아래 좌측의 이미지와 같다.

ret 영역에는 함수 실행이 끝나 다음에 돌아갈 메모리의 주소가 담기게 되는데, 스택에서의 BOF 취약점을 이용하여 해당 위치의 값을 printflag 함수의 시작 주소로 덮어버리면 임의로 printflag 함수를 호출해버릴 수 있게 된다.

  이때, check라는 변수에 저장된 값이 '0xdeadbeef'인지 검증하고, 만약 다른 값으로 덮어쓰였다면 프로그램을 종료해버리는 로직이 포함되어 있으므로 check 영역은 값을 덮어쓰되, 정확한 위치에 '0xdeadbeef'로 덮어 프로그램이 눈치채지 못하게 하는 것이 관건이다. 참고로 해당 문제에 한정해서 printflag의 주소는 항상 동일한 값을 가지고 있으므로 실시간으로 가져올 필요없이 고정된 페이로드를 사용해도 좋다.

 

우측 이미지에 있는 것처럼 페이로드로는 아래와 같이 작성할 수 있다.

b'A' * 140 + b'\xef\xbe\xad\xde' + b'B' * 8 + b'\xf6\x11\x40'

 

 

'War Game > CTF' 카테고리의 다른 글

[SCTF2023] SQLi 102  (0) 2023.08.22
[SCTF 2023] SQLi 101 - writeup  (0) 2023.08.22
[SCTF 2023] BOF104 - writeup  (0) 2023.08.22
[SCTF 2023] BOF103 - writeup  (0) 2023.08.22
[SCTF 2023] BOF102 - writeup  (0) 2023.08.22