스터디 (58) 썸네일형 리스트형 PyDbg 를 이용한 소프트 후킹 소프트 후킹을 이용해 모질라 파이어 폭스가 데이터를 암호화 시키기 전 데이터를 스니핑 해보자. 파이어폭스는 통상적으로 SSL 암호화를 사용한다.어느 함수에 후킹을 할 지는 본인의 선택이지만, 여기서는 PR_Write 함수에 후킹을 설정한다. 이 함수가 호출되면 ESP+8을 통해 암호화 되기 전의 아스키 문자열에 대한 포인터를 얻을 수 있다. ESP 레지스터로부터 오프셋+8의 위치라는 것은 (오프셋이란 거리를 이야기 한다.)아스키 문자열이 PR_Write 함수에 두 번째 파라미터로 전달된다는 의미이다. --> 암호화 되기 전 아스키 문자열을 스니핑 하기 위해서는, 이 함수를 후킹한다.(수정) 이 함수를 후킹할 경우, 아스키 문자열을 스니핑 할 수 있다. 파이어폭스 웹 브라우저를 열고 https://www... firfox_hook.py from pydbg import * from pydbg.defines import * import utils import sys dbg = pydbg() found_firefox = False pattern = "password" def ssl_sniff(dbg,args): buffer = "" offset = 0 while 1: byte = dbg.read_process_memory(args[1] + offset, 1) if byte != "\x00": buffer += byte offset += 1 continue else: break if pattern in buffer: print "Pre-Encrypted: %s" % buffer return DBG_CONTINUE # find firefox P.. hippie_easy.py import immlib import immutils def getRet(imm,allocaddr,max_opcodes = 300): addr = allocaddr for a in range(0,max_opcodes): op = imm.disasmForward(addr) if op.isRet(): if op.getImmConst() == 0xC: op = imm.disasmBackward(addr,3) return op.getAddress() addr = op.getAddress() return 0x0 def showresult(imm,a,rtlallocate): if a[0] == rtlallocate: imm.log("RtlAllocateHeap(0x%08x,0x%08x,0x%08x) 질문 정리 (2015-01-26) 1. 메모리에 직접 헥스값을 넣는 방법2. args 형태로 넣는 헥스값과 소스파일내에서 초기화한 헥스값의 길이차이. 8시간의 대장정. from immlib import * def main(args): shellcode="\x7f\xac" length = len(shellcode) shellcode=shellcode.encode("HEX") imm = Debugger() imm.log("Shellcode length : %s" % len(shellcode)) # shellcode = shellcode.encode("HEX") imm.log("We Finding : %s" % shellcode) regs = imm.getRegs() imm.log("EIP : 0x%08x" % regs['EIP']) imm.log("EBP : 0x%08x" % regs['EBP']) imm.log("ESP : 0x%08x" % regs['ESP']) add.. 질문 기록 EIP 제어권을 획득한 후에는 쉘 코드가 실행되게 만들어야 한다. 일반적으로 레지스터나 레지스터 값의 상대적인 오프셋이 쉘 코드의 주소를 가리킨다. 책 원본 소스파일 # -*- coding: cp949 -*- from pydbg import * from pydbg.defines import * import struct import random def printf_randomizer(dbg): parameter_addr = dbg.context.Esp + 0x8 counter = dbg.read_process_memory(parameter_addr,4) #read_process_memeory returns binary string counter = struct.unpack("L",counter)[0] print "Counter: %d" % int(counter) random_counter = random.randint(1,100) random_counter = stru.. Memory Breakpoint 이론, 함수 정리 메모리 브레이크 포인트는,1. 브레이크 포인트를 설정할 메모리 영역의 베이스 주소와 페이지 크기를 구한다.2. 해당 메모리 영역 페이지의 접근 권한을 변경해 보호 페이지 (Guard Page) 로 설정한다.3. CPU가 보호 페이지에 접근하려 하면 GUARD_PAGE_EXCEPTION 가 발생.4. 이 예외를 처리하는 핸들러에서 페이지 속성을 원래대로 바꾸고 실행이 계속되도록 한다. 페이지의 크기를 계산하려면 먼저 운영체제에게 디폴트 페이지 크기를 질의해야 한다.이를 위해 GetSystemInfo() 함수를 이용해 SYSTEM_INFO 구조체 정보를 구한다.SYSTEM_INFO 구조체의 dwPageSize가 시스템의 페이지 크기 값을 나타낸다. 페이지의 접근 권한 정보를 구하고 변경하는 방법은 ,1. 메.. 이전 1 2 3 4 5 6 7 8 다음