Return to libc 공격은 버퍼 오버플로 공격 

NX bit가 설정되어 있는 경우 이를 우회하기 위해 사용

PIE가 적용되지 않았을 경우. 코드 섹션의 값은 고정이므로

GOT 값을 변경 후 return to plt로 사용 가능.

 

x64의 경우 do_system()에 movaps 인스트럭션이 추가됨. 따라서 16바이트로 stack alignment를 지켜야함.

※movaps : 프로그램 흐름이 함수 프롤로그로 옮겨지는 시점에서는 rsp+8이 항상 16의 배수이어야 함.

이를 우회하기 위해 no-op gadget을 사용하여 system 함수전에 추가. (우분투의 경우 18.04 이상)

 

movaps에 대한 자세한 사항은 다음 사이트를 참고.

  https://hackyboiz.github.io/2020/12/06/fabu1ous/x64-stack-alignment/

 

X86


32bit 환경에서는 함수의 매개변수에 접근할 때

  • argv[0] : ebp+8
  • argv[1] : ebp+C

다음과 같이 접근

따라서 공격 페이로드는 다음과 같음

payload : RET(system) + dummy( 더미값) + argv[0]('/bin/sh')

 

X64


64bit 환경에서는 함수의 매개변수에 접근할 때

  • argv[0] : rdi
  • argv[1] : rsi
  • argv[2] : rdx

레지스터를 조작하기 위해 Gadget을 사용.

payload : RET(Gadget) + GadgetValue + CallFunc

ROP의 경우,

paload : RET(Gaget) + GadgetValue + (Gadget + GadgetValue) + callFun1 + (Gadget + GadgetValue) + callFunc2..

Gadget 으로 레지스트리 값을 변경 후 함수를 호출

※ (Gadget + GadgetValue ) 조건을 맞추기 위해 여러번 사용해도 무관

rdx Gadget의 경우 찾기 어려움 --> return to csu 공격 사용.

 

 

'CTF' 카테고리의 다른 글

Sigreturn ROP  (0) 2022.05.02
서브루틴 내에서 연속된 함수호출 시 EBP ( RBP )  (0) 2021.07.21
CTF 문제 풀이  (0) 2021.06.19

+ Recent posts