FSB 공부를 하며 FSB에 관한 문제를 더 풀어보고 정리하고 싶어서 메모에다가 남긴다.
먼저, 파일을 다운받고 IDA로 열어서 코드를 확인해보자.
main함수에 printf(&buf) 부분에서 FSB 취약점이 터지는걸 확인할 수 있다.
함수를 살펴보면,
hide라고 아주 수상하게 생긴 함수가 존재한다.
hide 함수를 이용해서 해결하면 될 것 같다.
우분투에서 한번 실행해보자.
처음 입력한 AAAA가 포맷 스트링을 입력한 후로 4번째에 hex 값으로 출력이 되었다.
그렇다면, 순서는 이렇다.
1. read 함수로 입력을 받을 때 앞 부분에 exit 함수의 GOT 주소를 넣어준다.
2. %hn (%n)을 활용해서 처음에 넣은 exit_GOT 주소위치에 hide 함수의 주소를 넣도록 조작한다.
※ %hn은 %n과 다르게 2byte씩 들어간다.
먼저, hide의 주소와 exit의 GOT주소를 구해보자.
두 개의 주소를 구했다.
3가지 방법으로 익스를 짜볼 것이다..
먼저, %n을 써서 짜보자!
hide 주소인 0x080485b3을 10진수로 바꿔주고 앞에 got 주소가 4byte였기 때문에 -4를 해준다.
그리고 %4$n에서 4$는 오프셋이다.
이렇게 익스를 하면 시간이 조금 걸린다.
두 번째로 %hn을 써서 익스를 짜보자.
기본 문자열 개수는 GOT - 2와 GOT 주소인 "\x16\xa0\x04\x08" + "\x18\xa0\x04\x08" = 8byte 이다.
잘 이해가 되지 않는다면 이 글을 보면 도움이 될 것 같다..
똑같이 익스가 터진걸 볼 수 있다.
세 번째로는 pwntools가 제공하는 FSB 저격 함수를 사용해서 익스를 짜보자!
이 함수를 알고난 뒤로는 웬만해서는 앞의 방법들로 FSB 문제를 풀지 않을 것 같다.
익스를 짜보자.
정말,, fmtstr_payload() 함수가 귀찮은 일들을 한번에 다 해결 해준다..
fmtstr_payload() 함수에 대해 더 자세히 알고싶다면 pwntools 기술문서에 가서 더 알아보자.
docs.pwntools.com/en/stable/fmtstr.html#pwnlib.fmtstr.fmtstr_payload
성공적으로 익스가 됐다.
플래그는 YCTF{S1mPl3_1s_tH3_b3sT} 이다.
'메모용' 카테고리의 다른 글
ASLR 정리 (0) | 2021.08.24 |
---|---|
메모리 보호 기법 [ NX-Bit(MS : DEP) ] (0) | 2020.12.18 |
PLT & GOT 간단하게 정리. (0) | 2020.08.21 |