https://linarena.github.io/windows-0x05
위 블로그에서 알고 있었던 부분은 넘어가고 0x05부터 정리하겠습니다 ㅎㅎ
SEH overwrite 할때 handler에 ppr 가젯을 넣으면 어떻게 next로 오게 되는지 확인해 보겠습니다.
SEH 공부하면서 본 그림입니다. ㅇㅇ
위 그림은 SEH 구조체 입니다. 총 8byte로 _next와 _handler로 구성되어 있습니다.
[그림 1-1] 확인하면 _next는 다음 EXCEPTION_RECORD의 주소를 담고 있습니다.
_handler는 실제로 에러 처리 과정을 실행할 함수이고, 구조는 아래와 같습니다.
[그림 1-3]을 확인하면 에러 처리 함수는 4개의 인자를 필요로 하며, 함수 실행시 실행에 필요한 인자들은 stack에 구성합니다.
따라서 에러 처리 함수가(_handler)가 동작되면 stack 구조는 아래처럼 구성됩니다.
_handler 함수의 인자 중 EstablierFrame은 이전 Frame의 주소(NextSEHRecord 주소)를 가지고 있습니다.
따라서 아래 그림 처럼 payload를 작성하면 shellcode가 실행됩니다.
[그림 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가 되는 겁니다.
아래는 우회 과정을 살펴본 것입니다.
이번 글을 통해서 handler에 ppr 가젯을 넣으면 next로 오게 되는지 알게 되었습니다.
'윈도우 공부' 카테고리의 다른 글
JMP SHORT, 어디까지 점프 가능한가? (0) | 2024.03.06 |
---|---|
windows-0x01 (0) | 2024.03.06 |