728x90
Buffer OverFlow (버퍼 오버플로) 
메모리를 다루는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점.
Buffer overrun (버퍼 오버런) 이라고도 함

버퍼 오버플로는 보통 데이터를 저장하는 과정에서 그 데이터를 저장할 메모리 위치가 유효한지를 검사하지 않아 발생한다. 이러한 경우 데이터가 담긴 위치 근처에 있는 값이 손상되고 그 손상이 프로그램 실행에 영향을 미칠 수 있다. 특히 악의적인 공격으로 인해 프로그램에 취약점이 발생할 수도 있다. 

Buffer (버퍼)
데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역이다.
버퍼는 컴퓨터 안의 프로세스 사이에서 데이터를 이동시킬 때 사용된다. 보통 데이터는 키보드와 같은 입력 장치로부터 받거나 프린터와 같은 출력 장치로 내보낼 때 버퍼 안에 저장된다

 

취약한 코드 작성

#define _CRT_SECURE_NO_WARNINGS //Warning(scanf, strcpy, fopen) C4996 Error 로 부터 방지
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void hidden_function () {
    printf("Hidden text!\n");
    printf("BOF success!\n");
}

int main () {
    void(*fp)();
    
    char name2[20];
    char name[40];
    
    printf("Input name : ");
    scanf("%s", name);
    
    strcpy(name2, name);
    printf("Name : %s", name2);
    
    return 0;
}
  • 최적화, 전체 프로그램 최적화, 보안검사, 임의 기준 주소, DEF 옵션 해제 후 릴리즈 모드로 컴파일

 

OllyDbg 실행 

main() 내부

  • 컴파일한 exe파일을 OllyDbg로 실행
  • main()함수를 찾아 함수 내부로 들어간다

 

  • 버퍼의 길이를 확인하지 않는 strcpy() 확인

 

  • dest 주소부터 RET주소까지의 크기 계산
    • 정확하게 RET에 Hidden_function 의 주소를 입력하기 위함

 

메모리 구조 변화

  • Buffer (24Byte) + SEP (4Byte) = 28 Byte
  • RET 주소에 hidden_function 주소를 넣어 최종 payload 작성
    • 28 Byte + 4 Byte ( hidden_function 주소)
  • 메모리 구조에서 보여주듯 RET 주소 이전까지 0x90 (어셈블리어 : NOP) 을 채워줌
  • 이후 RET 주소에 hidden_function의 주소값을 맵핑해  hidden_function이 실행되도록 함

 

AAAAAA 입력했을 때 스택

  • 입력값을 받는 주소에 BP점을 지정 후 F9로 진행
  • 'AAAAAA' 입력 후 스택 확인

 

Stack에 맵핑

  • "AAAAAA" 을 입력했을 때 스택에 들어가는 위치로 부터 28Byte까지 0x90으로 맵핑
  • RET 해당하는 다음 스택에 0x00401080 주소 맵핑 -> hidden_function  위치로 보냄

 

결과 확인

  • F9를 눌러 결과 확인
  • 'BOF sucess!' 를 출력 성공 결과를 확인할 수 있다

 

BOF 하지 않고 실행

  • 일반적으로 시도할 경우 입력값이 그대로 strcpy 되는 것을 확인할 수 있다


결론

  • scanf, strcpy, fopen'  버퍼의 크기를 확인하지 않는 명령어들은 이러한 공격에 취약함을 확인할 수 있다
  • 버퍼 오버플로 보호는 가장 일반적인 버퍼 오버플로를 검출하기 위해 사용되며 함수가 귀환할 때 스택이 변경되었는지 검사한다. 변경되었다면 프로그램이 세그멘테이션 오류를 발생 시키며 중단된다. 그러한 시스템의 세가지 예가 gcc 패치인 립세이프 LibSafe, 스택 가드, 프로폴리스이다. 마이크로소프트의 데이터 실행 방지 모드는 명백히 SEH 예외 처리기를 가리키는 포인터를 덮어쓰기로부터 보호한다. 
  • 버퍼의 크기를 확인하는 함수를 작성해줌으로 버퍼이상의 데이터가 들어오면 제거될 수 있게 한다.

 

'Reversing' 카테고리의 다른 글

Switch.exe / Switch2.exe  (0) 2021.08.26
if.exe ; if_hard.exe  (0) 2021.07.21
Reversing 01.  (0) 2021.07.21
리버스 엔지니어링 개요  (0) 2021.07.20

+ Recent posts