Lluvia의 보안공부 RSS 태그 관리 글쓰기 방명록
2023-11-28 18:00:07

이번 글에서는 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