ID : level20
PW : we are just regular guys
1.
드디어 마지막이다! level20으로 로그인 하고, hint 파일을 읽어보자.
코드를 해석해보자.
#include <stdio.h>
main(int argc,char **argv) //프로그램 실행과 동시에 사용자 입력을 받음
{ char bleh[80]; //문자형 bleh변수에 80바이트 만큼의 크기 할당
setreuid(3101,3101); //clear 계정의 프로세스 ID
fgets(bleh,79,stdin); //fgets함수로 bleh변수에 79바이트 만큼의 사용자 입력을 받음
printf(bleh); //bleh변수에 저장된 값 출력
}
해석을 참조하면, fgets 함수로 문자열을 입력받고 bleh[80]버퍼에 79만큼 입력 받는다.
즉 BOF 공격으로 인한 ret 값 변조를 할 수 없다는 뜻이다.
printf 함수에서 변수를 포맷스트링 인자 %s를 사용하지 않고, 단순 배열을 매개변수로 받았다.
이러면 FSB(Format String Bug) 취약점이 발생하게 되므로 렙20은 이 취약점을 이용해 해결하면 될 것 같다.
printf()의 소멸자인 .DTORS 주소를 이용해 문제를 풀어보자...
💡 Format String Bug란?
FSB 취약점은 Format string(%s, %x와 같은 c언어의 서식 문자)의 Bug를 이용해 메모리를 변조하는 기술이다.
아래는 흔히 쓰이는 포맷스트링이다.
💡 .dtors란?
GNU 컴파일러로 컴파일된 프로그램은 소멸자와 생성자의 테이블 섹션인 .dtors와 .ctors을 생성한다.
생성자 함수와 .stors 섹션은 main()이 실행되기 전에 호출되고,
소멸자 함수와 .dtors섹션은 main()이 exit 시스템 콜로 종료되기 직전에 호출된다.
그렇기 때문에 우리는 main()의 ret영역을 덮어 씌워서 실행흐름을 조작해도 되지만, 해당 문제처럼 ret 주소를 찾기 어려운 경우(왜?) .dtors 영역을 이용해 실행흐름을 변경하면 된다!
어떤 식으로 문제를 해결할지 생각해 보자.
- .DTORS 주소 구하기
- 쉘 코드 환경변수 등록과 주소 획득
.......
여기까지만 적어 놨었네 ......?
(2020.02에 작성한 글입니다.)
'Pwnable > FTZ' 카테고리의 다른 글
[Linux] 명령어 정리 (find, 권한 관리) (0) | 2024.01.18 |
---|---|
[FTZ] level 19 풀이 <BOF> (0) | 2024.01.18 |
[FTZ] level 18 풀이 <BOF> (0) | 2024.01.18 |
[FTZ] level 17 풀이 <BOF-env> (0) | 2024.01.18 |
[FTZ] level 16 풀이 <BOF-함수 덮기> (0) | 2024.01.18 |