windows-0x05

oogu ㅣ 2024. 3. 8. 22:14

https://linarena.github.io/windows-0x05

 

windows-0x05

0x05 GS What is GS? GS는 STACK Cookie, Canary로도 불리는 메모리 보호 기법입니다. 이 GS는 BOF를 방어하기 위해 나온 기법 중 하나로, 함수가 시작될 때 STACK에 4 byte를 넣어놓고 함수가 종료될 때 이 4 byte가

linarena.github.io

 

 

위 블로그에서 알고 있었던 부분은 넘어가고 0x05부터 정리하겠습니다 ㅎㅎ

SEH overwrite 할때 handler에 ppr 가젯을 넣으면 어떻게 next로 오게 되는지 확인해 보겠습니다.

 

[그림 1-1]

SEH 공부하면서 본 그림입니다. ㅇㅇ

 

[그림 1-2]

 

위 그림은 SEH 구조체 입니다. 총 8byte로 _next와 _handler로 구성되어 있습니다. 

[그림 1-1] 확인하면 _next는 다음 EXCEPTION_RECORD의 주소를 담고 있습니다.

 

_handler는 실제로 에러 처리 과정을 실행할 함수이고, 구조는 아래와 같습니다.

 

[그림 1-3]

[그림 1-3]을 확인하면 에러 처리 함수는 4개의 인자를 필요로 하며, 함수 실행시 실행에 필요한 인자들은 stack에 구성합니다.

 

따라서 에러 처리 함수가(_handler)가 동작되면 stack 구조는 아래처럼 구성됩니다.

[그림 1-4]

_handler 함수의 인자 중 EstablierFrame은 이전 Frame의 주소(NextSEHRecord 주소)를 가지고 있습니다.

따라서 아래 그림 처럼 payload를 작성하면 shellcode가 실행됩니다.

 

[그림 1-5]

[그림 1-5]를 보면 _next는 jump to shellcode, _handler는 &pop pop ret으로 되어 있습니다.

앞서 EstablisherFrame은 이전 Frame의 _next의 주소를 담고 있다고 말했습니다.

_handler가 실행되면서 자체적으로 새로운 Frame을 생성하는데 이 함수의 인자 중 하나가 이전 Frame의 주소를 가지고 있으니까 다시 원래 Frame으로 돌아가서 shellcode를 실행하도록 만들자는 것입니다.

 

추가로 next에서 shellcode까지 거리가 6byte인 이유는 jump 0x06을 기계어로 바꾸면 06 eb가 됩니다. -> 2byte 명령어

그래서 90 90 06 eb로 구성합니다. 그럼 90 90 과 & pop pop ret을 뛰어 넘어야 하니까 6byte가 되는 겁니다.

 

아래는 우회 과정을 살펴본 것입니다.

 

[그림 1-6]
[그림 1-7]

 

 

이번 글을 통해서 handler에 ppr 가젯을 넣으면 next로 오게 되는지 알게 되었습니다.

'윈도우 공부' 카테고리의 다른 글

JMP SHORT, 어디까지 점프 가능한가?  (0) 2024.03.06
windows-0x01  (0) 2024.03.06