이번 글에서는 Off-By-One 취약점과 간단한 예제에 대한 글을 쓰도록 하겠다.
Off-By-One
문자열의 범위 1byte 차이로 발생하는 취약점으로
1byte 차이로 SFP가 \x00(NULL)으로 변조되어
기존의 SFP가 아닌 다른 주소로 리턴하게 되는 취약점이다.
다음과 같은 예제 코드를 이용하여 취약점을 살펴보자.
#include <stdio.h>
void copy_buf(char *buf) {
char temp[16];
read(0, temp, sizeof(temp));
for(int i = 0; i <= sizeof(temp); i++)
buf[i] = temp[i];
}
int main(void) {
char buf[16] = "";
copy_buf(buf);
return 0;
}
- main에서 크기가 16인 char배열을 선언한 후 배열의 주소를 copy_buf()의 인자로 넘겨준다.
- copy_buf()에서 크기가 16인 배열 temp을 선언하고 초기화한다.
- 이후 temp에 temp의 크기만큼 입력받는다.
- for문 반복으로 temp의 값을 buf으로 복사한다.
이때 for에서 쓰이는 변수 i가 0 ~ 16 까지 변하는데 buf의 인덱스는 0 ~ 15까지 이므로 buf넘어의 값까지 침범하게된다.
<main - disassemble>
<copy_buf - disassemble>
copy함수에서 off-by-one취약점이
발생하므로 copy_buf 앞뒤의 ebp값을
확인해보았다.
copy_buf() 호출전에 break를 걸고 ebp의 값을 확인해보면
0xf7ffd020인 것을 볼 수 있다.
하지만 copy_buf()호출 이후 main의로 복귀후 ebp를 확인하면 0xf7ffd020가 0xf7ffd010으로 바뀐것을 볼 수 있다.
즉, ebp의 값이 for문에서 발생한 off-by-one 취약점으로 인해 최하위 1byte가 변조된것이다.
이렇게 SFP가 1byte 변조되는 취약점을 Off-By-One이라고 한다.
'보안 > 시스템 해킹' 카테고리의 다른 글
Out-Of-Boundary (0) | 2023.11.30 |
---|---|
DreamHack - basic_exploitation_001 (0) | 2023.10.22 |
Dreamhack - basic_exploitation_000 (0) | 2023.10.22 |
[PlaidCTF] ropasaurusrex 문제 풀이 (0) | 2023.10.12 |
ShellCode - Egg Shell.part2 (1) | 2023.10.03 |