y0u_bat
[Window] 1. 스택 버퍼 오버 플로우 본문
[Window] 1. 윈도우 스택 버퍼 오버 플로우
예전에 이미 발견된 "Easy RM to MP3 Converter" 이라는 프로그램으로 실습했습니다.
이런식으로 생긴 프로그램이다.
여기서 어디가 취약하냐면, 플레이리스트를 로딩할때 버퍼오버플로우 취약점이 발견됩니다.
일단 플레이리스트의 확장자를 보니 m3u,pls,smi 등등 여러개 있는데 전부 다 됩니다.
전 pls를 확장자로 해보았습니다.
파이썬으로 확장자가 .pls로 되는 파일을 하나 만들고 그 내용을 대충 놉 3만개로 해줍니다.
그렇게 만들어진 파일을 한번 로딩 해보았습니다.
이런식으로 크래쉬까 뜨는걸 볼 수 있습니다.
"문제에 관한 정보 자세히 보기" 를 누르면 저렇게 나오는데,
저기서 예외 오프셋을 보면 90909090으로 변해 있는걸 볼 수 있습니다.
이제 버퍼의 길이를 구한다음 리눅스에서 했던 BOF처럼 하면 된다.
한번 windbg에서 보았다.
일단 cmd에서 "windbg.exe -I" 이런식으로 windbg 를 post-mortem 디버거로 등록 한다.
file -> Attach to Process 한다음 저 프로그램 프로세스를 어태치 해준다.
그다음 g(continue)을 눌러준다. 그러면 프로그램 버튼누르고 이런걸 할 수 있게 된다.
아까처럼 로딩해서 그 파일을 로딩한다.
그리고 크래쉬까 뜨면 저기 커맨드에서 90909090 나오는걸 볼 수 있다.
한번 R(레지스터 보기)를 해서 eip를 보았더니 90909090 이다.
이제 버퍼크기를 구한다음, 기존BOF와 비슷하게 BOF 해주면 된다.
버퍼 크기는 메타스플로잇의 pattern_create.rb 이라는 툴을 이용하면 된다.
일단 보니 25000~30000 사이에서 크래쉬뜨는걸 알 수 있었다.
그러므로 25000까지는 아무거나 넣고 그뒤에 메타스플로잇의 5000바이트의 패턴을 넣어준다.
이렇게 생성하고...
아까 말한데로 코딩해서 플레이리스트 파일을 만든다.
그다음 로딩하면 크래쉬가 뜬다.
eip가 42326b42이다. 이제 pattern_offset.rb이라는 툴을 이용하여, 버퍼크기를 구한다.
오프셋이 1086이 나온다.
오프셋이 1086이니 25000+1086 = 26086가 버퍼크기라고 볼 수 있다.
이제 41버퍼고 42424242가 eip로 들어가게 한번 이렇게 해보았다.
결과를 보았더니 크래쉬뜨면서 eip가 예상했던데로 42424242가 들어간것을 알 수 있다.
윈도우 스택구조가 [Buffer] [EBP] [EIP] [ESP] 이런식으로 되어있다.
ESP에 쉘코드를 올리고 EIP를 ESP에 두면 되는데,
ESP주소를 EIP에 바로 넣으면 안된다 왜냐하면 그 주소에 00이 포함 되어 있어서 널때문에 끊겨버린다.
그러므로 EIP에는 저 프로그램에서 쓰는 dll에서 JMP ESP의 주소를 구해서
그 jmp esp의 주소를 eip로 두면 jmp esp가 실행되어 esp로 이동되어 쉘코드가 실행이 된다.
dll에서 jmp esp 주소를 구하는 방법.
로드되는 dll중 s명령어로 메모리주소를 적고 그뒤에 찾을 opcode를 적는다. (jmp esp의 opcode : ff e4 )
s 주소 주소 ff e4 이렇게 치면 주소가 찾아져서 쭈르르 나오는데 거기서 00 없는걸 eip로 쓰고 하면 된다.
또는
커맨드에서 a를 누르고 jmp esp 하면 a눌렀을때 나오는 주소에 해당 어셈블리가 들어간다.
u 주소 해보면 내가 입력한 어셈블리가 나온게 보인다.
이제 eip까지 구했으니
직접해보면 계산기가 뜨는걸 볼수있다.
참고로 windbg에서 했을때만 되고 windbg껏다 키면 해당 dll에서 구한 ff e4 opcode의 주소는 1~2바이트씩 달라진다.
또 a로 임의적인 주소에 입력한 어셈블리어 주소도 당연히 안된다.
저두 문서보고 따라하면서 공부하는거라 windbg에서 밖게 못했네요..
ps.
윈도우에서 하면 dll에 주소가 4바이트중 1~2바이트씩 주소가 바끼는데, 프로그램을 껏다키면 다시 주소가 바끼기 때문에 브루트포싱을 못하는...
아무튼 문서보고 따라 공부해보았습니다.
'System' 카테고리의 다른 글
[SSA] 시스템 스터디 1주차 정리(어셈블리) (1) | 2015.10.06 |
---|---|
[Window] 2. 윈도우 버퍼오버플로우(여러가지 쉘코드로 점프) (0) | 2015.09.01 |
hand-ray 연습5 (0) | 2015.08.19 |
hand-ray 연습4 (0) | 2015.08.19 |
hand-ray 연습3 (0) | 2015.08.19 |