[스택 오버플로우를 발생시키는 memcpy 루틴]

 실제 SEH Overwrite 취약점이 존재하는 상용 프로그램을 분석했습니다. 프로그램 종류나 제품명은 공개하지 않겠습니다. 정확히는 SafeSEH밖에 걸려있지 않지만 여기서의 방법을 이용하면 설령 Stack Canary가 있더라도 우회가 가능하기 때문에 제목에는 두 미티게이션 모두 적어두었습니다.

 문자열을 입력받는 루틴에서 길이 체크를 하지 않아 스택 기반 오버플로우가 발생합니다. 현재 명령을 보면 rep movsd 으로 ESI의 값을 EDImemcpy하게 되는데, 이들은 각각 덤프 1 탭과 스택에 나타나 있습니다. ESI에는 오버플로우용 NOP Sled와 쉘코드, SEH Overwrite 코드가 Input으로 들어와 있고 EDI는 부모 함수의 스택 프레임 내부 주소값입니다.

 

[오버플로우 전]


[오버플로우 후]

 rep movsd 명령이 수행되고 위에서 설명한대로 SEH가 변조되었음을 볼 수 있습니다.

 

[익셉션 발생]

 부모 함수의 스택 프레임을 수정하여 오버플로우를 일으켰기 때문에 원래 있던 함수에서는 정상적으로 리턴되고, 직후 EBP-10의 값을 EAX에 넣고 EAX에 포인터 참조 연산을 수행합니다. 여기서 EBP – 10은 아까 rep movsd 명령에 의해 NOP으로 채워졌기 때문에 잘못된 포인터(0x90909090) 참조로 함수 에필로그 이전에 익셉션이 발생합니다.

 

[SEH Overwrite 실행 과정]

 이 글에서 설명할 때 사용했던 그림으로 살펴보면 pExceptionHandlerppr 가젯의 주소가 들어가 있고, pExceptionHandlerCall한 상태이므로 ESP는 스택 위쪽 어딘가에 있는 ret을 가리키고 있을 것입니다. ppr 가젯이 실행되면서 retExceptionRecordpop되고, EstablisherFrameret되는데 해당 주소는 pNextSEHRecord이고 여기에는 미리 넣어둔 Short JMPEB AC 가 있어 현재 주소에서 -82만큼 점프하게 됩니다. 이는 NOP Sled + Shellcode의 주소이고, 따라서 쉘코드가 정상적으로 실행됩니다.

 

[쉘코드 실행 성공]

 NOP Sled를 타고 내려와 계산기를 실행시키는 간단한 쉘코드가 실행된 모습입니다.


블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

댓글을 달아 주세요