포너블

DSFSB

He110 2023. 11. 5. 22:53

"Double Stage Format String Bug"는 프로그래밍에서 발생하는 보안 취약점 중 하나이다. 포맷 문자열 버그는 사용자 입력을 제대로 검증하지 않고 포맷 문자열 함수에 직접 전달할 때 발생하는 취약점이다. 이 취약점을 통해 공격자는 스택에 있는 데이터를 읽거나 쓸 수 있다. 따라서 메모리 내용의 유출이나 임의의 코드 실행과 같은 공격이 가능하다.

"Double Stage Format String Bug"는 포맷 문자열 버그의 한 변형이다. 공격자가 한 번의 공격만으로는 메모리 주소를 파악하거나 조작하기 어려운 경우, 두 단계의 공격을 통해 원하는 정보나 조작을 달성한다. 첫 번째 단계는 메모리에서 필요한 정보를 추출하는 데 사용되며, 두 번째 단계는 그 정보를 바탕으로 실제 공격을 수행한다.

이런 취약점을 피하기 위해서는 사용자 입력을 결코 신뢰해서는 안 된다. 포맷 문자열 함수에 사용자 입력을 전달하기 전에, 그 입력을 반드시 검증하고 새니타이징해야 한다.

예제를 살펴보겠다.

우리의 목표는 mail을 덮어씌워서 교수님 바보를 없애는 것이다.

Show_mail함수에서 printf(mailbox)로 포맷스트링 버그가 발생한다. 이를 통해서 첫 번째 메모리 주소를 응용할 수 있다. 이 말은 다음 사진을 통해 이해할 것이다.



0x7ff...e00주소를 보면 0x7ff...e030으로 주소가 주소를 가르치는 것을 확인할 수 있다. 즉 이 값을 덮어씌우고 이 값을 다시 참조해서 덮어씌우면 DSFSB를 유발할 수 있는 것이다.

이 값을 mail함수의 주소로 만들고 이 값을 재 참조해서 덮어씌우면 "교수님 바보"을 덮어씌울 수 있다.

여기서 fd를 빼주는 이유는 fd만큼의 더미가 붙어져 있기 때문이다. 그리고 %c14$n으로 0x403600의 주소를 덮어씌우는 것이다. 그러면 mail주소의 값이 덮어씌워져 플래그를 획득할 수 있다.