PWNABLE/HITCON TRAINING
[HITCON TRAINING] LAB8
리드론
2019. 1. 15. 04:04
[HITCON TRAINING] LAB8 → WRITE UP
해당 바이너리의 보호기법을 확인해본다.
해당 바이너리는 인텔 기반의 32비트 바이너리이며,
보호기법으로는 Stack Canary와 NX bit 및 Partial RELRO가 설정되어 있다.
주어진 소스코드를 확인해보자.
해당 소스코드를 확인해보니 전역변수로 magic이라는 변수가 주어져있고,
해당 변수가 0xda 또는 0xfaceb00c일 경우 적절한 플래그 파일을 보여주는 것으로 확인된다.
하지만 고려해야할 사항이 있다.
해당 로직에는 magic변수를 설정해주는 어떠한 로직조차 존재하지 않는다.
결과적으로 어떠한 방법을 이용해서 magic 변수를 설정해야 하는 것으로 확인된다.
Line11에서 포맷스트링(Format String Bug)가 발생하는 것으로 확인된다.
이를 이용해서 magic 변수의 값을 바꿀 수 있다.
서식문자 %n을 이용하면 변수의 값을 바꾸는 것이 가능해진다.
서식문자 %n은 지금까지 출력한 바이트 수로 %n의 해당하는 offset에 데이터를 변경해준다.
해당 기법을 이용하기 위해서는 먼저 magic 변수의 주소와 입력버퍼가 몇번째 offset에 존재하는지 알아야한다.
magic 변수의 주소 : 0x0804a038
offset의 위치 : 7번째
이를 기반으로 페이로드를 작성하자.
첫번째 플래그를 얻기 위해서는 직접 서식문자열을 지정하여 포맷스트링 공격을 진행하였으며,
두번째 플래그를 얻기 위해서는 fmtstr_payload 함수를 사용하였다.