libc leak없이 libc 메모리 주소에 aaw를 해야하는 상황에서 많은 삽질을 하다가 해당 기법을 알게되었는데요..

Stack Pivot은 특정한 쓰기 가능한 공간에 Fake Stack을 구성해 놓고 rsp로

스택의 위치를 바꿔 Chanining을 이어갈 수 있는 기법입니다.

해당 기법은 SFP와 leave Gadget을 사용하므로 최소한 RET 주소까지는 오버플로우가 일어나야 합니다.

보통 오버플로우 기법을 이용할 때 입력 공간이 부족한 경우 이용하게 됩니다.

 

조건

  • 최소한 RET까지 오버플로우가 일어나야 한다
  • leave ; ret ; 가젯이 있어야 함
    leave 의 경우 mov rsp , rbp ; pop rbp ; 와 같이 Gadget 조각을 모아 조건을 성립시켜줘도 됨
  • Fake Stack의 위치는 Stack처럼 사용하므로 RW 권한이 있어야 함

 

SFP에 Fake Stack의 주소를 넣고

RET에 leave Gaget을 넣게 되면 rsp를 원하는 위치로 지정할 수 있습니다.

 

 

이후 Fake Stack의 스택프레임에 맞춰 Chain을 이어나갈 수 있게 됩니다.

기본적인 개념은 이렇습니다. 하지만 이를 응용하면 생각지도 못한 위치로 aaw가 가능하게 됩니다.

 

AAW 응용


libc leak을 하지 않은 상황에서 라이브러리 주소에 특정 바이트를 적는 것은 어렵습니다. 그런데 

Stack pivot을 사용하여 라이브러리 주소를 담고있는 특정 주소의 -0x8의 위치에 pop rsi 가젯을 위치시키면

주소값이 read함수의 인자로 넘어가면서 자연스레 해당 라이브러리 주소에 원하는 byte를 적을 수 있게 됩니다.

Fake Stack의 구성은 다음과 같습니다.

영역의 크기를 잘 고려해서 페이로드를 짜야하지만, 이런 창의적인 방법으로 libc leak 없이 aaw가 가능합니다!

 

정교한 익스를 위한 추가사항

Fake Stack의 Chain별 길이를 조절하는게 중요합니다. 예를 들어, FULL RELRO가 걸려있는 ELF에서

특정 영역에 Fake Stack을 생성했다면 길이가 너무 길어 .got영역와 같은 영역을 페이로드가 침범할 수 있습니다.

이런 경우 바이너리가 바로 죽어버리게 되는데 이는 익스플로잇에 민감한 사항이 될 수 있습니다.

이럴 경우, RW가 가능한 메모리를 우선 확인하고 사이즈를 조절한 뒤 Chain을 연결하여 ROP를 터트리는 방향을

고려해봐야 합니다.

'System' 카테고리의 다른 글

Linux] Seccomp  (0) 2022.04.28
DLL Load(IAT, EAT)  (0) 2022.03.27

+ Recent posts