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 |