Stack Cookie(GS Cookie)

스택 쿠키는 스택 버퍼 오버플로우(Stack Buffer Overflow)를 차단하기 위해 함수의 시작과 끝 부분(지역 변수와 SFP, RET 사이)에 4바이트의 랜덤한 쿠키값을 삽입한 컴파일러 옵션이다.


컴파일러는 함수 시작 시 데이터 섹션(.data)에 저장된 쿠키값을 스택에 저장하고, 함수가 종료되기 전 데이터 섹션(.data)에 저장된 쿠키값과 스택에 저장된 쿠키값을 비교한다.


만약 쿠키값이 변경되었다면 오버플로우 공격이 발생한 것이므로 RET를 실행하지 않고, 예외 처리 구문을 실행하고 프로그램은 비정상 종료된다.

 

즉, 스택 버퍼 오버플로우를 성공하려면 RET를 변조해야 한다. RET를 변조하려면 RET 전의 쿠키값을 변조하게 되므로 RET를 실행하지 못하고 예외가 발생한다.


쿠키 변조 시 예외 발생

reader.cpp는 입력 받은 파일의 내용을 1000 바이트 읽어 500 바이트 크기의 readbuf 변수에 저장할 때 스택 버퍼 오버플로우가 발생한다.


스택 쿠키를 실습하기 위해 컴파일러 옵션을 설정하고, 컴파일하면 스택 쿠키가 적용된 reader.exe 파일이 생성된다.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
 
int main(int argc, char* argv[])
{
         char readbuf[500] = {0, };
         printf(" # text reader #\n");
         if (argc != 2) {
                 printf(" Usage : reader.exe filename\n", argv[0]);
                 exit(1);
         }
         FILE *f = fopen(argv[1], "r");
         fgets(readbuf, 1000, f);
         printf("File Contents : %s\n", readbuf);
}

프로젝트 속성 > 구성 속성 > C/C++ > 코드 생성 > 보안 검사 : 보안 검사 사용(/GS)


컴파일러 옵션


프로젝트 속성 > 구성 속성 > 링커 > 고급

○ 임의 기준 주소 : 아니오(/DYNAMICBASE:NO)

○ DEP(데이터 실행 방지) : 아니요(/NXCOMPAT:NO)

○ 이미지에 안전한 예외 처리기 포함 : 아니요(/SAFESEH:NO)


컴파일러 옵션


파이썬 스크립트로 600개의 "A" 문자열을 1.txt 파일로 저장하는 코드를 작정한다. 작성된 코드를 실행하면 1.txt 파일이 생성된다.


# 1.txt - by Daze
import struct
 
junk1 = "A" * 600
 
f = open("1.txt", "w")
f.write(junk1)
f.close()
 
print "[+] text file created successfully"

이뮤니티 디버거로 reader.exe를 인자를 지정하여 연다. 메인 함수(0x401000)로 이동하면 시작 위치에 스택 쿠키가 삽입됐다. 해당 코드는 데이터 섹션에 저장된 쿠키값을 EAX에 복사하고, EAX와 EBP를 XOR 연산한 값을 EBP -4에 저장한다.


○ File > Open > 파일 이름 : reader.exe / Arguments : 1.txt > 열기

○ Ctrl + G > 401000


함수 시작 시 쿠키값 삽입


함수 중료 전 기존 쿠키값을 비교하는 코드가 추가됐다. EBP-4는 데이터 섹션의 쿠키값이 추가 됐었다.


하지만, 스택 버퍼 오버플로우로 쿠키값이 "A" 문자열로 변조되었고, 데이터 섹션에 저장 된 원본 쿠키값과 ECX(합수 시작 시 저장해둔 쿠키 값, 변조 됨)를 비교하여 다르면 RET를 실행하지 않고, 예외 처리 함수(report_gsfailure())가 호출되어 TerminateProcess에 의해 프로세스가 종료된다.


함수 종료 전 쿠키값 비교


데이터 섹션에 저장된 쿠키값은 항상 고정적이지 않다. 이를 위해 프로그램을 재실행하여 쿠키값을 비교하면 서로 다르다는 것을 확인할 수 있다.


프로그램 실행 시 쿠키값 (1)


프로그램 실행 시 쿠키값 (2)


Alt + S를 누르면 프로그램에 등록된 SEH 체인이 총 2개이다. 스택창에서 0x12FF78 주소를 따라가 보면 next SEH 주소(0x12FFC4)를 가리킨다.


마찬가지로 0x12FFC4 주소를 따라가 보면 End of SEH chain 주소(0xFFFFFFFF)를 확인할 수 있다.


등록된 등록된 SEH 체인 체인 (1)


등록된 SEH 체인 (2)


○ 스택 버퍼 오버플로우가 발생하면 스택에 저장된 쿠키값이 변조

○ 쿠키값이 다르므로 예외 발생

○ 예외가 발생하면 등록된 SEH 체인으로 프로그램이 종료

○ 프로그램 실행 시 쿠키값은 랜덤한 값으로 설정되므로 추측하기 어려움


▶ Tomabo MP4 Player 3.11.6 취약점 분석 (SEH Based Stack Overflow)

▶ Stack Adjustment - Stack BOF

▶ SafeSEH 우회 - Stack BOF

▶ SEH Overwrite - Stack BOF

▶ SEH(Structured Exception Handler) - Stack BOF

▶ Easy RM to MP3 Converter(Stack Buffer Overflow) 취약점 분석

▶ UAC(User Account Control) 우회 - PowerShell

  • 카카오톡-공유
  • 네이버-블로그-공유
  • 네이버-밴드-공유
  • 페이스북-공유
  • 트위터-공유
  • 카카오스토리-공유