FPO 취약점이란 감염된 SFP를 통해 쉘 코드나 원하는 주소로 jmp 시키는 공격 기법이다
하지만 이 공격을 하기 위해선 다음과 같은 조건이 충족되어야 한다
1. 최소 SFP에 1byte 이상의 BOF가 발생
2. main 코드에 서브 함수가 실행 되야 함
꽤 까다롭고 공격이론도 어려운지라 off_by_one이라는 취약점 외에 다른 취약점이 발생하지 않는다면 공격하는 방식이다
먼저 off_by_one를 모르는 사람은 이걸 보고 오길 바란다
https://noobhack.tistory.com/62
[NOOBHACK] off by One (OBO), 취약점
#include void copy_buf(char *buf, int sz) { char temp[16]; for(i = 0; i
noobhack.tistory.com
그리고 앞서, 이 취약점을 배우려면 다음과 같은 지식을 배워야한다
에필로그나 배우고 오길
https://noobhack.tistory.com/63
[NOOBHACK] 함수 에필로그
오늘은 어셈블리어에서 함수의 끝 작업을 수행하는 에필로그에 대해 알려주겠다 끝 작업은 보통 leave와 ret로 나뉘어 진다 그리고 eip와 esp, ebp 레지스터에 대해 알 필요가 있다 ebp: 변수의 기준의
noobhack.tistory.com
자 이제 에필로그를 완벽하게 알게 되었다 싶으면 이제 SFO를 배울 수 있다 먼저 코드는 이거다
이론을 설명하기 위해 조건에 맞게 버퍼 그림을 설정하겠다
기본 메모리 구조다 이 과정에서 sfp가 어떻게 발생하는지 함수 에필로그를 통해 보여주겠다
먼저 위의 코드는 off_by_one이라는 취약점이 발생한다 name이라는 배열을 꽉 채웠을 때 함수의 반복문에서는
최대 길이+1를 더 수행하기 때문에 sfp가 감염될 우려가 있다 그럼 SFP가 1byte 감염됐을 때에 함수 에필로그를 살펴보자
leave
mov esp, ebp
여기서 sfp의 주소는 임의로 정한다 그리고 감염된 1byte는 /x00로 간주하여 진행한다 먼저 mov esp, ebp를 통해 ebp가 가르치는 위치를 같게 만든다
POP ebp
POP ebp를 통하여 같은 위치에 있는 esp를 +4byte 한 뒤 ebp는 자기가 담겨 있는 주소로 따라 가버렸다
RET
POP eip
POP eip를 함으로써 esp가 가리키고 있는 값을 자신에 복사하며 esp의 값을 +4byte한다
지금까지 얼핏 보면 정상적인 에필로그를 따라 가고 있는 것 처럼 보이지만 ebp는 잘못된 sfp 따라가고 있다
이를 꼭 숙지하자
JMP eip
이건 굳이 보여줄 필요 없이 eip가 담겨있는 주소로 이동한다
이제 잘못된 함수의 에필로그가 끝났으니 이제 main 함수의 에필로그를 쭉 살펴보자
leave
mov esp, ebp
현재 esp가 mov 명령어를 받아 잘못 이동된 ebp로 이동한 모습이다
POP ebp
POP ebp를 통해 메인 buf중 어디를 가리키고 있는지 모를 ebp는 어딘가 이동했으므로 그림에서 제외했다
그리고 esp는 +4byte 더해졌다
RET
POP eip
이제 eip도 pop이 되어 esp를 따라감과 동시에 esp는 또 +4byte 더해졌다
JMP eip
이렇게 보면 우린 지금까지 우리가 서브함수에서 조작한 sfp에 따라 메인 ret에 있어야 할 eip가 우리가 조작한 주소에 담겨지게 된다 그런데 eip가 가리키고 있는 주소로 점프를 하는데.. 가리키고 있는 주소가 만약에 쉘코드나 우리가 임의로 조작한 악성코드 위치라면??? 말이 매우 달라진다 이 처럼 우리가 메인 buf를 조작 할 수 있는 주소를 sfp로 조작 시켜 eip가 그 곳으로 jmp 할 수 있게 유도하여야 한다
sfo 공격의 중요한 포인트는 우리가 조작 할 수 있는 메인 스택 주소-4byte 와 서브 함수의 sfp를 조작 하여
(메인스택 주소의-4byte) 메인 함수 에필로그의 POP ebp가 될 때 둘이 같은 주소에 있어야 eip가 쉘코드 위치로 따라오게 되어 쉘 코드를 실행 할 수 있다는 것을 알고 있자
처음엔 꽤 어려워도 꼭 2, 3번 읽다보면 시원하게 이해가 될 것이다
'해킹 공격' 카테고리의 다른 글
[NOOBHACK] 윈도우, 리눅스 패킷 캡쳐 코드 (2) | 2023.09.19 |
---|---|
[NOOBHACK] 언더플로우?? (0) | 2023.09.10 |
[NOOBHACK] 버퍼 오버플로우 BOF(buffer overflow) (0) | 2022.08.18 |
[NOOBHACK] XSS 공격 기법 (0) | 2022.08.16 |
[NOOBHACK] 중간자 공격 MITM (0) | 2022.08.15 |