/ POSTS

windows-0x04

0x04 Random STACK

What is Random STACK?
[그림 1-1]

Random STACK은 메모리에서 STACK이 할당되는 주소가 프로그램 실행시마다 변경되는 방어 기법입니다.

이 방어 기법이 적용되면 Shellcode의 주소를 정확히 알 수가 없기 때문에 기존의 Direct EIP Overwrite로는 공격을 성공할 수가 없습니다.

JMP ESP

Shellcode의 주소를 알 수 없는 상황을 우회하기 위해서 사용하는 방법 중 하나가 “JMP ESP”를 활용하는 것입니다.

RET 주소에 JMP ESP의 주소를 넣는다는 것인데 어떻게 우회가 가능한지 살펴보겠습니다.

[그림 1-2]

위 그림은 우리가 지금 실습하고 있는 프로그램의 공격 전/후 STACK 구조입니다.

Main의 에필로그 과정에서 마지막 RETN이 실행될 때 Shellcode를 실행하러 가기 때문에 그 과정을 살펴보겠습니다.

[그림 1-3]
  • mov esp, ebp : 이전 Frame으로 돌아가기 위해 ESP를 현재 Frame의 기준점으로 데리고 옵니다.
  • POP ebp : 이전 Frame의 기준 값을 POP하여 EBP에 넣어주어 이전 Frame의 기준 값으로 돌아갑니다.
  • RETN : POP EIP, JMP EIP을 통해 다음 실행할 곳으로 이동합니다.

RETN이 일어날 때의 ESP를 유심히 보면, 항상 RET 다음에 위치하고 있다는 것을 확인할 수 있습니다.

따라서 RET를 &JMP ESP로 해둔다면 다음 실행할 곳의 위치는 RET 다음 위치가 됩니다.

이 점을 이용하기 위해 Payload의 구성도 다음과 같이 변경됩니다.

[그림 1-4]

위 Payload와 그림 1-1의 오른편 공격 후 STACK 구조를 다시 봅시다.

이전과는 다르게 RET 뒤에 Shellcode가 위치하도록 Payload를 구성한 것을 보실 수 있습니다.

이런 방법을 이용하면 Shellcode의 주소를 정확히 알 수 없는 환경에서도 공격을 성공시킬 수가 있습니다.

How to Find &JMP ESP?

공격의 흐름과 방법은 아마 이제 다들 아실거라 생각됩니다. 그런데 한 가지 의문이 남죠?

아마도 “&JMP ESP는 어떻게 찾습니까?”일텐데요.

이번 연재에서는 Immunity Debugger를 통해서 찾는 방법을 알려드리겠습니다.

[그림 1-5]
[그림 1-6]

Immunity Debugger에서 ALT+M을 하면 메모리 창이 띄어집니다. 메모리 창에서 CTRL+F를 눌러 “FF E4”(=JMP ESP)를 검색하면 아래와 같이 JMP ESP의 주소를 찾을 수 있게 됩니다.

다음 편에서는 GS 기법에 대해 알아보도록 하겠습니다.