Stack Cookie (GS aka. canary) 4

2018. 1. 27. 19:350x04 pwnable/윈도우즈 어플리케이션 취약점 분석

728x90

GS와 SafeSEH에 대해 배운 것을 정리해보았다.



1. 스택 쿠키 / GS 우회 방법

스택 기반 오버플로우 보호 매너니즘을 우회할 수 있는 가장 쉬운 방법은 쿠키 값을 추측하거나 계산하는 것이라고 한다.

쿠키가 정적인 값일 경우는 그대로 복사하여 쿠키 위치를 탐색한 뒤, 그 값을 페이로드에 삽입하면 된다.

하지만, 대부분의 쿠키는 동적이다. (직관적으로 사용하기 어렵게 해둔다.)


그렇지만, 스택 쿠키가 있다고 겁먹을 필요 없다. 스택 쿠키의 원리를 조금 적다보면 그 이유를 알 수 있다.

스택쿠키에 의해 bof를 감지하게 되면, 그 즉시 예외 핸들러의 존재 여부를 찾게 된다. 처음으로 찾는 예외 핸들러는 "개발자가 직접 코드로 작성한" 것이지만, 개발자가 직접 코드를 작성한게 없다면 운영체제가 설정해둔 핸들러를 동작시킨다. 


이때 엄청 나게 많은 값을 임의로 넣게 되면, 예외 핸들러가 존재하는 스택의 위치까지 버퍼가 덮이게 될 것이며, 이 때 해커는 SEH의 구조체가 존재하는 위치를 알게 되고, 덤으로 seh_next의 위치를 정확히 알게 된다. 


해커가 SEH_NEXT위치를 알았다면, 익스플로잇의 가능성이 조금 증가하게 된다. 



2) 예외 핸들링을 이용해 우회

위에서 설명했듯이 쿠키가 변조 됨을 감지하게 되면 자동으로 예외처리에 의해 핸들러를 동작시키게 된다. 

이 상황에서 해커는 SEH_NEXT위치를 찾을 수 있다고 위에 적어두었다. SEH_NEXT 위치를 찾았지만, safeseh라는 보호 메커니즘까지 걸려 있을 경우가 있다. 이 경우는 SEH_NEXT를 알아도 처리하지 못한다. 이때 방법은 SafeSEH가 적용되어 있지 않은 dll 모듈을 해당 프로세스에서 찾아서 사용해야 한다.


SEH_Handler는 POP POP RET 혹은 ESP/EBP , CALL XX, JMP XX를 이용하면 된다. 


3) 스택에 있는 쿠키와, .data 섹션에 있는 쿠키를 교체하는 방법 

이건 잘 모르겠지만, .data섹션에 있는 쿠키는 고정적인 것으로 보인다. 


4) 함수 내의 스택 데이터를 스택까지 덮어쓰는 방법을 이용해 우회 

객체 및 구조체를 가리키는 포인터가 함수로 보내지면 이 객체 및 구조체는 그들의 호출자 스택에 상주하게 된다. 그렇게 되면 이것이 GS 쿠키 우회를 가능하게 한다. 

뭔 소린가 하니, 객체와 vtable 포인터를 덮어쓸 때 이 포인터를 가짜 vtable로 이어주면, 가상함수호출을 리다이렉트하고 악성코드를 실행할 수 있게 된다.


5) 쿠키 값을 추측 및 계산하는 방법을 이용해 우회 

GS 쿠키의 엔트로피를 낮춰야 한다고 한다. 


6) 쿠키 값이 정적인 점을 이용해 우회

쿠키 값이 매번 같거나 정적 값을 가진다고 판단되는 경우, 공격자는 오버라이트 시 스택에 이 값을 그냥 덮어 쓴다.