ii4gsp
SEH Overwrite 기법 본문
Typedef struct _EXCEPTION_REGISTRATION {
EXCEPTION_REGISTRATION *next;
EXCP_HANDLER handler;
}EXCEPTION_REGISTRATION, *PEXCEPTION_REGISTRATION;
SEH 구조체의 멤버 next는 다음의 구조체를 가리키는 포인터이고, handler는 예외처리를 담당하는 핸들러이다.
SEH를 이용해 스택 쿠키를 우회하는 방법은 스택 쿠키를 포함한 버퍼를 모두 덮어쓰고 예외처리 핸들러에 쉘 코드 주소를 덮어씌워
예외를 강제로 발생시키면 예외처리가 아닌 쉘 코드를 실행시키면 된다.
위와 같이 설정해주자
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char buf[500] = { 0, };
printf("Reader\n");
FILE *f = fopen(argv[1], "r");
fgets(buf, 1000, f);
printf("Read : %s\n", buf);
}
argv[1]을 받고 buf에 파일의 내용을 쓰는 코드이다.
buf는 500byte인데 1000byte를 입력받아 오버플로우가 발생한다.
올리디버거로 파일을 열어보자
SEH 체인 보면 두 개의 SEH 체인을 볼 수 있다.
contents = "A" * 556 + "b" * 4 + "C" * 4 + "D" * 200
f = open("test.txt", "w")
f.write(contents)
f.close()
파이썬으로 RET와 SEH를 덮어주자
생성된 test.txt를 인자 값으로 주고 디버거를 실행하면 fgets로 복사하는 중 예외가 발생한다.
'시스템 해킹 > Technique' 카테고리의 다른 글
[Heap] Use After Free (0) | 2020.01.20 |
---|---|
[Heap] Buffer Overflow (3) | 2020.01.19 |
구조적 예외 처리 SEH (Structured Exception Handler) (0) | 2020.01.15 |
윈도우 실행 파일 구조 (0) | 2020.01.13 |
쉘코드 모음 (0) | 2020.01.08 |
Comments