공격 대상 시스템에 공격 문자열을 전달할 때 셸 코드에서 사용할 수 없는 문자들이 있다.
예를 들면 strcpt() 함수에 대한 스택 오버플로우를 발견했다면
그것을 공격하기 위한 공격 코드는 NULL 문자를 포함하면 안된다.
왜냐면 strcpy() 함수는 NULL 문자를 만나면 데이터 복사 작업을 멈추기 때문이다.
오버플로우가 발생한 이후의 스택 상태
EIP 레지스터가 ESP 레지스터를 가리키고 있는게 보인다.
바이트의 0xcc 는 해당 위치에 브레이크 포인트가 설정된 것처럼 단순히 디버거를 멈추게 만든다.
공격을 수행하기 전에 해당 문자를 셸 코드 인코더로 인코딩 해야 한다.
badchar.py 를 작성하자
badchar.py
-------------------------------------------------------------------
from immlib import *
def main(args):
imm = Debugger()
bad_char_found = False
address = int(args[0],16)
shellcode = "<<검사할 셸 코드를 여기에 복사해 넣는다.>>"
shellcode_length = len(shellcode)
imm.log("address : 0x%08x" % address)
imm.log("Shellcode length : %d" % length)
imm.log("attack shellcode : %s" % canvas_shellcode[:512])
imm.log("in memory shellcode : %s" % id_shellcode[:512])
count = 0
while count <= shellcode_length:
if debug_shellcode[count] != shellcode[count]:
imm.log("bad char detected at offset %d" % count)
bad_char_found = True
break
count += 1
if bad_char_found:
imm.log("[*****]")
imm.log("bad character found : %s" % debug_shellcode[count])
imm.log("bad character original : %s" % shellcode[count])
imm.log("[*****]")
return "[*] !badchar finished, check log window"
-------------------------------------------------------------------
위 스크립트에서는 Immunity 디버거 라이브러리 함수를 readMemory() 하나만 사용했다.
나머지는 모두 파이썬의 단순한 문자열 비교문이다.
필요한 것은 비교할 셸 코드를 아스키 문자열로 스크립트 안에 복사해 넣는 것이다.
-------------------------------------------------------------------
!badchar<검색을 수행할 주소>
-------------------------------------------------------------------
'파이썬 스터디 과제 > 파이썬 해킹 프로그래밍' 카테고리의 다른 글
5장-4 악성 코드의 안티 디버깅 루틴 무력화 (0) | 2015.01.26 |
---|---|
5장-3 공격코드개발-3 윈도우의 DEP우회 (0) | 2015.01.26 |
5장-3 공격 코드 개발 (0) | 2015.01.25 |
5장-2 Immunity 디버거 101 (0) | 2015.01.25 |
5장-1 Immunity 디버거 (0) | 2015.01.25 |
댓글