설명하기에 앞서 Return Address는 ret gadget과 같은 말이다.

 

NOP Sledf랑 비슷해 보이는 RET Sled, ret sled란 무엇일까?

 

RET Sled란 RET를 여러번 호출해서 스택상의 위치를 계속 옮기는 작업이다.

RET는 무엇인가?

RET는 어셈블리어 명령어로 두가지로 구성된다.

 

pop eip, jmp eip

 

pop과 jmp는 많이 들어봐서 익숙할 것이다.

 

pop eip를 통해 stack pointer가 가리키는 값을 eip에 저장하고

jmp eip를 통해 eip에 저장된 그 위치로 이동하는 일을 수행한다.

ret가 실행됬을때의 ESP, EIP

(stack pointer는 ret가 실행되기전 leave명령어의 pop ebp가 실행된 후 RET+4를 가리킨다.)

 

leave 명령어로 인해 base pointer는 caller가 가지고 있던 값으로 복귀 되고 스택의 top은 return address를 가리키게 된다.

이때 ret의 명령어를 이용해 pop eip로 eip에 Return Address를 넣고 jmp eip로 retrun address로 이동하여 해당 주소에 있는 명령들이 실행되게 된다.

 

RET Sled는 이를 이용하여 ret 명령어를 계속해서 실행하는 것이다.

 

이를 이용하면 원하는 위치에 명령어를 넣고 실행시킬수 있다.

 

예시를 간단히 설명하겠다.

 

 

return address에 ret명령어의 주소가 있다면 ret가 한번 더 실행되고 pop eip가 일어나며 eip에는 뒤에 있는 주소가 들어가게 된다.

이를 계속 반복하여 원하는 위치를 ESP가 가리킬때 pop eip와 jmp eip를 통해 쉘같은 것들을 실행 시킬수 있는 것이다.

'Basic Concepts > System' 카테고리의 다른 글

SFPO(Stack Frame Pointer OverFlow)  (0) 2020.04.22
BOF(Buffer Over Flow)  (0) 2020.04.22
NOP Sled  (0) 2020.04.10
경쟁상태(race condition)  (0) 2020.02.25
스택(Stack)과 스택프레임(Stack Frame)  (0) 2020.01.26

+ Recent posts