[1주] 02장-디버거

Posted by dw0rdptr
2015. 1. 12. 17:31 Study/파이썬 해킹 프로그래밍

디버거 

디버거는 실행중인 프로세스를 트레이스하거나 동적 분석을 할수 있게 도와준다.

특히 동적분석은 악성코드 조사나 퍼저 적용에 있어 필수적이기 때문에 해커에게 디버거는 매우 중요하다고 볼 수 있다


디버거에는 화이트박스 디버거와 블랙박스 디버거가 있다.

화이트박스 디버거 : 개발플랫폼이나 IDE 등이 개발자가 자신이 작성한 코드를 디버그할 수 있게 자체적으로                             내장하고 있는 디버거이다.

블랙박스 디버거 : 리버스 엔지니어링이나 버그를 찾아내는 등 원본 소스코드가 없는 상태에서 분석을 목적으로                         사용되는 디버거이다.




범용 CPU 레지스터

레지스터는 CPU 내의 작은 저장공간으로 매우 빠르다.x86 아키텍처에서 CPU는                                       다음 8개의 범용 레지스터를 사용한다.


EAX : 산술 연산을 수행하기위해 또는 함수의 리턴값을 전달하기 위해 사용

EDX : 복잡한 연산을 위해 추가적으로 데이터를 저장할때 사용(또는 범용목적의 저장소)

ECX : 반복적으로 수행되는 연산에 주로 사용(미리 반복할 값을 넣어두고 감소시키면서 카운트를 셈)

ESI  : 시작지 인덱스(Source Index)

EDI  : 목적지 인덱스(Destination Index)

EBX : 특정한 목적이 없으므로 사용자가 목적에 맞게 씀

스택 레지스터

EBP : base pointer 레지스터. 스택을 위에서부터 아래로 자란다고 할때, 가장 위쪽이되는 위치를 가리키는 레지스터

ESP : stack pointer레지스터, 스택을 위에서부터 아래로 자란다고 할때, 스택의 가장 낮은 위치를 가리키는 레지스터



스택

스택은 FILO 구조이며 보통 스택을 아래에서부터 쌓아올리는 방식으로 표현하는데, 실제로 스택은 메모리를 효율적으로 쓰기 위해 높은주소부터 낮은주소로 쌓이므로 고드름처럼 자라는 방식으로 이해했다.

예시는 1장에서 함수호출규약을 정리할때 쓴 소스이다


ex) int c_fun(a,b,c){

int a_fun

{
        

         

cdecl 호출규약을 기준으로 파라미터 c,b,a 순서대로 push되고 지역변수 a_fun 을 선언했을때 스택프레임 모습이다.





[1주] 01장 - 개발환경 구축

Posted by dw0rdptr
2015. 1. 12. 16:15 Study/파이썬 해킹 프로그래밍

ctypes?

복잡한 C 데이터 타입을 사용할수 있게하며 로우레벨 함수를 제공하는 강력한 라이브러리 중 하나.


ctypes 라이브러리에서는 cdll(), windll(),oledll() 세 가지 방법으로 동적 라이브러리를 로드할 수 있다. 


* 동적라이브러리 : 다수의 응용 프로그램들이 공유할 수 있는 기능을 별도의 바이너리 파일로 분리해

   프로세스가 실행될 때 해당 프로세스에 동적으로 링크되는 것이다. 윈도우에서는 dll,        

   리눅스에서는 so라 불리고 이들은 모두 외부에 export 함수를 제공한다.


* export : dll이 변수나 함수를 외부로 제공하는 것


cdll() 방식은 표준 cdecl 호출규약을 이용하는 함수를 익스포트하는 라이브러리를 로드하는데 쓰이고

windll()방식은 win32api가 사용하는 stdcall 호출규약을 이용하는 함수를 익스포트하는 라이브러리를 로드


ctypes 라이브러리를 import 한다음, c 런타임함수인 printf()를 이용해보자(c 런타임 라이브러리는 msvcrt.dll)



>>>form ctypes import *

>>>msvcrt = cdll.msvcrt

>>>string = "Hello World!"

>>>msvcrt.printf("%s",string)

Hello World!



함수호출규약 : 함수를 어떻게 호출하는지 방법을정의한것


cdecl 호출규약 : 파라미터(매개변수)를 오른쪽에서 왼쪽방향으로 스택에 push한다.

그리고 함수 호출자가 스택에 push된 파라미터를 정리한다. 대부분의 C 시스템에서

      사용되므로 꼭 알아두자


ex) int c_fun(a,b,c);             *C언어

   

      push c                         *어셈블리 언어

push b

push a

call c_fun

add esp,12            //int형 파라미터가 세개이므로 스택포인터레지스터(esp) 를 12바이트증가



stdcall 호출규약 : cdecl과 마찬가지로 파라미터를 오른쪽에서 왼쪽방향으로 스택에 push

 호출된 함수(예시에선 c_fun 함수)가 리턴하기 전에 스택을 정리한다.


두 호출규약 모두 EAX 레지스터를 이용해 리턴값을 전달한다.


C 데이터 타입


파이썬의 C 데이터 타입 지원으로 C나 C++로 작성된 컴포넌트와의 통합이 가능






'Study > 파이썬 해킹 프로그래밍' 카테고리의 다른 글

[2주] 03장 - 윈도우 디버거 개발 (2)  (0) 2015.01.18
[2주] 03장 - 윈도우 디버거 개발 (1)  (0) 2015.01.17
api 기초  (0) 2015.01.12
[1주] 02장-디버거  (0) 2015.01.12
점프투파이썬 정리  (0) 2015.01.12

점프투파이썬 정리

Posted by dw0rdptr
2015. 1. 12. 13:45 Study/파이썬 해킹 프로그래밍

* 글은 개인 공부정리로 쓰였기 때문에 c언어 지식을 전제로 정리했습니다

* python 3.4 기준


Python?

- 1990년 암스테르담의 귀도 반 로섬(Guido Van Rossum)에 의해 만들어짐

- 인터프리터 언어

- 인간다운 언어

- 문법이 쉬워 빠르게 학습가능

- 간결하고 강력하다


자료형

1.숫자형 

-  정수, 실수, 8진수, 16진수가 있고 파이썬에서는 복소수를 내부적으로 지원

-  복소수 관련함수


>>>a = 1+2j     #허수부분은 j로 표현
>>>a.real       #실수값 리턴
1.0
>>>a.imag      #허수값 리턴
2.0
>>>a.conjugate()    #켤레복소수 리턴
(1-2j)

*파이선에서 주석은 # 이다.

 2.숫자연산

- 다른 프로그래밍 언어와 마찬가지로 (+,-,*,/)로 사칙연산 수행

- x**y : x의 y제곱의 값을 리턴

- x%y : x를 y로 나눈 나머지값을 리턴



3.문자열


- 파이썬에서 문자열을 만드는 방법은 네가지로 구분

-"Hello World!"

-'Hello World!'

-"""Hello World!"""

-'''Hello World!'''



- 문자로써 " 나 ' 를 문자열에 포함시킬수 있는 방법은 "의 경우엔 '로 문자열을 감싸고

   ' 의 경우엔 "로 문자열을 감싼다. 다른방법으로는 \(역슬래시)를 이용한다

>>>string= "He\'s my brother"


- 여러 줄짜리 문자열 처리에는 \n(줄바꿈)을 삽입하거나 """을 이용한다




1)문자열 연산


-문자열 합치기 : +

-문자열 곱하기 : *


>>>string1 = "Hello"
>>>string2 = "Hi"
>>>print(string1 + string2*2)
HelloHiHi

2)인덱싱과 슬라이싱

- 문자열을 하나의 배열처럼 보고 인덱싱과 슬라이싱 가능

- a[0]일경우 문자열 a의 첫번째 문자를 가리킴 a[-1]은 뒤에서 첫번째 문자

- a[0:3] 은 문자열 a의 첫번째부터 3번째 문자까지 잘라냄 (0 <= a <3)

*뒤에 range 함수에서도 나오겠지만 범위를 나타내는 경우 ~이상 ~미만

- 문자열에서 문자 하나만을 바꿀경우 슬라이싱기법 이용


3)문자열 포매팅

>>>print("I am %d years old" % 18)
I am 18 years old

기본적으로 c언어의 문자열 포매팅과 같다

다른점은 %s의 경우 어떤 형태로든 에러가 나지 않고 변환이 가능하다.


4)문자열 관련 함수

변수명.upper() : 소문자->대문자 변경

변수명.lower() : 대문자->소문자 변경

변수명.count('x') : 문자 x의 개수를 셈

변수명.find('x') : 문자 x가 처음으로 나온 위치 반환 없을경우 -1 반환

변수명.index('x') : find함수와 같지만 찾는문자가 없을경우 에러발생

변수명.join('abc'): abc 각각의 문자 사이에 변수 a의 값 삽입

변수명.lstrip(), a.rstrip() : 각각 가장 왼쪽, 오른쪽의 연속된 공백을 지움

변수명.strip() : 양쪽의 연속된 공백을 모두 지움

변수명.replace(바뀔 문자열, 바꿀 문자열) : 문자열 내의 특정한 값을 다른값으로 치환

변수명.split('x') : x를 구분자로 문자열나눔. 아무런값x면 공백을 기준

변수명.swapcase : 대문자는 소문자로, 소문자는 대문자로 바꿈




3.리스트

- []로 감싸줌

- 리스트를 포함한 어떠한 자료형도 요소값으로 가질수 있다.

- 인덱싱와 슬라이싱 가능

- a = [1,2,3,[4,5,6]] 에서 5를 가리키려면 a[3][1] 또는 a[-1][-2] 로 가리킬 수 있다.

- 더하기, 곱하기(+,*) 도 가능. 문자열과 동일함

- 리스트는 요소 하나씩 수정, 삭제가 가능


리스트 관련 함수

변수명.append(x) :  마지막에 요소 x추가

변수명.sort() : 순서대로 정렬

변수명.reverse() : 순서를 역순으로 뒤집는다.

변수명.index(x) : x가 있으면 그 위치 반환

변수명.insert(x,y) :x 위치에 y 삽입

변수명.remove(x) :첫번째로 나오는 x 삭제

변수명.pop() : 맨 마지막 요소를 반환하고 그 요소 삭제

변수명.count(x) : x의 개수 반환

변수명.extend(x) :리스트 x를 더하여 확장


4.터플

- 기본적으로는 리스트와 완전히 동일

- [] 대신 ()로 둘러싸임

- 터플은 요소값을 변화시킬 수 없다.


5.딕셔너리

- {}로 둘러싸임

- 각각의 요소는 Key:Value 와 같이 쌍을 이루고있고, 쉼표로 구분됨

ex) dic = { key1:value1 , key2:value2, key3:value3}

- 리스트는 Key로 사용할 수 없음

- 중복되는 Key는 사용하지 않는게 좋다.


제어문

제어문으로는 if, while, for 가있는데, 기본문법은 여타 다른언어와 동일하다.


if문의 기본 구조


if <조건문>:

<수행할 문장1>

<수행할 문장2>

...

else:

<수행할 문장A>

<수행할 문장B>

...

*파이썬은 들여쓰기를 생략하면 문장이 실행이안되므로 유의하자


elif (C언어의 switch문)


if <조건문>:

<수행할 문장1>

<수행할 문장2>

...

elif <조건문>:

<수행할 문장A>

<수행할 문장B>

...

elif <조건문>:

<수행할 문장a>

<수행할 문장b>

...

...

else:

<수행할 문장 c>

<수행할 문장 d>

...


for문의 기본구조


for 변수 in 리스트(또는 터플, 문자열):

<수행할 문장1>

<수행할 문장2>

...


range 함수


a = range(10)   #0부터 9까지의 숫자 range 객체를 만든다 (시작번호를 지정하지 않으면 0)

a = range(2,11) # 2부터 10까지의 range 객체





입출력


함수


def 함수명(입력 인수):

<수행할 문장1>

<수행할 문장2>

...


-입력값이 몇개가 될지 모를때에는 *args를 사용한다


def 함수이름(*args):

<수행할 문장1>

...


args라는 변수가 입력값들을 모아 터플로 만들어 주기 때문에 입력값이 몇개든지 상관이 없다.


- return값은 언제나 하나이며, 함수를 종료하고 싶을 때에도 사용한다


-입력인수의 초기치를 설정할 수 있다.

def info(name,old=18)

print("나의 이름은 %s입니다." %name)

print("나이는 %d살 입니다." %old)


자주 변하지 않는 값일때는 함수선언을 할 때 초기치를 미리 설정할 수 있다.



입력과 출력


입력은 input을 사용


ex) number = input("숫자를 입력 : ")


출력은 print 사용

>>> print("Hello" "World")        #따옴표로 둘러싸인 문자열은 +연산과 동일
HelloWorld       
>>> print("Hello","World")        #문자열 사이에 콤마는 띄어쓰기
Hello World

-한 줄에 출력하려면 end 파라미터를 이용해 끝문자를 지정


파일 입력과 출력

-파일 생성하기

파일객체 = open(파일이름, 파일열기모드)


-파일 열기모드

r : 읽기모드

w : 쓰기모드

a : 추가모드

-파일 읽기


readline() : 파일의 내용을 한줄씩 읽어들임

readlines() : 파일의 모든 라인을 한꺼번에 읽어서 리스트로 반환

read() : 파일을 전부 읽어 문자열로 반환


-sys모듈 입력


도스창에서 프로그램을 실행할때 인자를 같이 주는 방식이다.


ex) #입력받은 인자를 그대로 출력

import sys


args = sys.argv[1:]

for i in args :

print(i)


클래스


클래스 : 함수나 변수들을 모아놓은 집합체

- 클래스의 구조

class 클래스이름[(상속할 클래스명)]

<클래스 변수 1>

...

def 클래스함수1(self,인수1,인수2...)

<수행할 문장1>

...

def 클래스함수2(self,인수1,인수2...)

<수행할 문장A>

...

...


- 인스턴스 : 클래스에 의해 생성된 객체

ex) cat = Animal()

cat은 객체=cat은 클래스 Animal의 객체 = cat은 클래스 Animal의 인스턴스



self 사용하기


>>>class service:
    def setname(self,name):
        self.name=name
    def sum(self,a,b):
        print("%s, %d+%d=%d" %(name,a,b,a+b))

>>>p = service
>>>p.setname("Lake")
>>>p.sum(3.6)
Lake, 3+6=9


setname은 __init__ 메소드(생성자)로 생략가능


>>>class service:
    def __init__(self,name):
        self.name=name
    def sum(self,a,b):
        print("%s, %d+%d=%d" %(name,a,b,a+b))

>>>p = service
>>>p.sum(3.6)
Lake, 3+6=9


__del__ 메서드(소멸자)는 인스턴스가 삭제되거나 종료될 때 호출된다

>>>class service:
    def __init__(self,name):
        self.name=name
    def sum(self,a,b):
        print("%s, %d+%d=%d" %(name,a,b,a+b))
    def __del__(self)
        print("bye,%s" %self.name)

>>>p = service
>>>del p
bye,Lake


모듈

모듈 :함수나 변수들, 또는 클래스들을 모아놓은 파일.다른 파이썬 프로그램에서 불러쓸 수 있음(c의 헤더파일)


# module.py
def sum(a,b):
    print("module 불러옴")
    return a+b

모듈을 추가할때는 import를 사용


>>>import module
>>>print(module.sum(2,6))
module불러옴
8


예외처리

유연한 프로그래밍을 위해선 에러처리가 필요하다

 에러처리에는 다음과 같은 방법들이 있다

# try,except만 씀
try:
    ...
except:
    ...

#발생에러만 포함한 except문
try:
    ...
except 발생에러:
    ...
 
#발생에러와 에러메시지변수까지 포함한 except문
try:
    ...
except 발생에러 as 에러메시지 변수:
    ...


'Study > 파이썬 해킹 프로그래밍' 카테고리의 다른 글

[2주] 03장 - 윈도우 디버거 개발 (2)  (0) 2015.01.18
[2주] 03장 - 윈도우 디버거 개발 (1)  (0) 2015.01.17
api 기초  (0) 2015.01.12
[1주] 02장-디버거  (0) 2015.01.12
[1주] 01장 - 개발환경 구축  (0) 2015.01.12