문제의 c 소스 코드입니다.
flag를 출력하면 되는 문제입니다.
메인 함수를 디스어셈블 한 결과
flag는 0x601060에 있음을 알게 되었습니다.
c 소스 코드 중 아래 두 문장이 FSB 취약점을 유발합니다.
scanf("%lu",&n);
printf(n);
printf() 함수의 동작을 이해하면 풀 수 있는 문제입니다.
예를 들어
printf("%d %d %d",1,2,3);
라는 구문이 있다면
첫 번째 인자는 형식표현자이고
두 번째 인자부터 첫 번째 인자에 적힌 표현식들로 순서대로 전달됩니다.
printf() 함수가 실행될 때 "%d %d %d" 문자열을 찾아서
저장되어 있는 주소(문자열의 시작 주소)로 값이 바뀝니다.
예를 들어 "%d %d %d"가 0x506050에 저장되어 있다면
printf(0x506050,1,2,3);
으로 바뀌게 되는 겁니다.
printf(n);을 생각해 봅시다.
printf() 함수에서 n은 첫 번째 인자입니다.
scanf("%lu",&n);
n의 값으로 정수를 입력받습니다.
n에 들어간 이 정수 값이 printf() 함수에서주소로 사용될 수 있습니다. -> FSB 취약점 발생
n에 0x601060을 넣어주면
printf(0x601060);
이 되기 때문에 flag 변수의 값을 출력할 수 있습니다.
0x601060을 10진수로 바꾼 값 6295648을 넣어주면
플래그가 출력됩니다~
'write-up(pwn) > G04T' 카테고리의 다른 글
[G04T] Simple BOF 3 (0) | 2022.09.08 |
---|---|
[G04T] Simple FSB 3 (0) | 2022.09.08 |
[G04T] Simple FSB 2 (0) | 2022.09.06 |
[G04T] Simple BOF 2 (0) | 2022.09.05 |
[G04T] Simple BOF 1 (0) | 2022.09.05 |