포너블

64bit format string bug

He110 2023. 10. 1. 23:12

 저번 시간에 이어 이번엔 64bit format string bug에 대해 알아보고자 한다. 지난 시간에 설명한 32bit format string bug와는 조금 다른 구성을 가진다. 32비트에서는 주소를 앞에 쓰는 방식으로 포맷스트링 버그를 유발했다면 이번엔 변조하고자 하는 주소를 뒤에 써줘야된다. 이 이유를 다음 예제를 통해서 설명하고자 한다.

먼저 지난 번과 같은 코드인지 64비트로 컴파일 했다는 점에서 차이가 존재한다. 글로벌 변수를 0x12345678로 맞춰줘야지 correct문자열이 뜬다.  메모리 상에서 보면 0x7ffc1eae8560부터 우리가 덮어쓸 주소가 들어가고 offset이 6이니 우리가 덮어 쓸 주소의 offset은 9가 된다. 따라서 2바이트 씩 나눠서 입력을 해준다.

4660은 10진 형태이며 이를 16진수로 변환하면  0x1234가 된다. 이후 0x5678에서 0x1234를 빼주면 174676이 된다. 이후 메모리 정렬에 맞게 해주면 된다. 이때 a로 패딩이 필요한데 메모리를 까보면 예쁘게 딱 맞게 떨어지므로 a로 패딩할 필요는 없다.

내용을 종합해서 페이로드를 구상하면 다음 코드와 같다. 

페이로드를 실행하면 다음과 같이 global_variable이 0x12345678이고 correct 문자열이 출력된 것을 확인할 수 있다.