constWORLDant

Stack Cookie (GS aka. canary) 3 본문

0x04 pwnable/윈도우즈 어플리케이션 취약점 분석

Stack Cookie (GS aka. canary) 3

data type ConS_tanT 2018.01.27 17:18

포스팅을 이어가보려 한다.


실습에 사용한 코드는 이것이다.


//Goal : bypass about GS and SafeSEH

//Author : c0nstant

//IDE : VS2017 X86 

//Compile Option : /GS , nonDEP, SafeSEH, NonASLR


#include <stdio.h>

#include <windows.h>



#define MAX_BUF (1000)


int main(int argc, char*argv[])

{

FILE *f;

char buffer[100]; // 100bytes

if (argc != 2)

{

perror("Usage : [filename] ");

}


f = fopen(argv[1], "r");

fgets(buffer, MAX_BUF, f);


fclose(f);

return 0;

}


취약점은 fgets에서 발생하게 되는 것으로 보인다. 

하지만, 진짜 취약점은 fclose(f)에서 터졌었다. 


나는 이 상황을 알게 되기 까지 8시간 이상이 걸렸다. 

주위에 지인이 없었더라면, 절대 알지 못했을 것 같다. 


일부러 몇일이 지나서 포스팅을 한다. 내가 이해하고 넘어간건지, 외워서 넘어간건지 테스트를 하고 싶었기 때문이다.


간단하게 쉘코드를 짜둔 뒤 어디부분에서 SEH_next 가 변조되는지 패턴을 통해 알아본다 (Immunity Debugger) 


패턴을 통해 seh_next의 offset 값을 알 수 있다. 


대부분의 이런 유형은 seh_next에 jmp short, seh_handler에 pop pop ret 가젯을 이용하면 뚝 딱 이었는데 


이번 예제는 그렇지 않았다.  왜 그렇지 않은지 살펴보려면 스택을 하나하나 유심히 봐야한다.


여기서 내가 한 실수는 stack lock을 걸고 있어서 유동적인 변화를 쉽게 탐지 하지 못하였다.


스택을 탐지하다보면 이상한 점이 하나 있다. 분명 fgets에서 취약점이 발생해야 하는데 fclose의 인자 값이 변형 되어버린다.


그 이유인 즉슨, 지금 fgets와 fclose는 하나의 함수에 내포되어 있다. 


그렇다면, 함수가 리턴되는 곳은 적어도 fclose(f) 이후가 되게 된다. 

그렇기 때문에 fgets의 값을 fclose(f) 까지 덮어 버리게 된다. 


fclose함수 내부에 접근하게 되면 cmp 0xFF라는 구문이 보이게 된다. 

그리고, 이 함수는 "유동적인" 파일 디스크립터 핸들러를 가지게 된다.


"유동적인" 값 즉 실행할 때 마다 프로세스에게 받는 핸들러 값이 다르게 되면, 페이크를 사용하라고 한다. (알려준 동생에게 너무너무 감사하다) 


암튼, 페이크를 찾기 위해서는 fopen에서 대입되는 f 값을 덤프 떠야 하고, 그 덤프 값을 넣어 주는 스택의 주소를 명확하게 파악해야한다.


나는 페이로드를 다 짜 놓고, 스택의 주소를 잘못 적어서 자꾸 익스플로잇이 되지 않았었다. 


그렇다면 그 스택 주소를 구했다면, 또 하나 테스트를 해야하는 것이 있다. 버퍼로 부터 offset 몇 번째에 도달해야 fclose의 인자 값을 덮을까이다.  그 인자 값 덮는 offset을 알았다면 그 부분에 덤프 떠놓은 값을 그대로 다 파이썬 코드로 입력을 해둔다. 


그리고, seh_handler에서는 계산기 쉘코드가 있는 곳으로 eip를 조작하면 익스플로잇은 끝나게 된다.


지금 와서 글로 적어보면 15줄도 채 되지 않는데 이 행위를 이해를 하지 못해서 8시간 이상 걸렸던 내 자신을 반성한다. 


공부하는 방식을 확 바꿀 필요가 있다. 


bypassGS.py

bypassGS.py



'0x04 pwnable > 윈도우즈 어플리케이션 취약점 분석' 카테고리의 다른 글

Stack Cookie (GS aka. canary) 4  (0) 2018.01.27
Stack Cookie (GS aka. canary) 3  (0) 2018.01.27
Stack Cookie (GS aka. canary) 2  (0) 2018.01.23
Stack Cookie (GS aka. canary)  (0) 2018.01.23
Target : Soritong 1.0  (0) 2018.01.19
Target : IntellTamper  (0) 2018.01.19
0 Comments
댓글쓰기 폼