반응형

python을 활용한 Data Science를 하기 위해서는 다음과 같은 환경에서 업무는 하는 것이 좋습니다.

(출처 : Python for Data Analysis)

 

1. Numpy (pip install numpy)

과학계산용 파운데이션 패키지

· 빠르고 효율적인 다차원 배열 객체 ndarry

· 배열 원소를 다루거나 배열 간의 수학 계산을 수행하는 함수

· 디스크로부터 배열 기반의 데이터를 읽거나 쓸 수 있는 도구

· 선형대수 계산, 푸리에 변환, 난수 발생기

· 파이썬과 c, c++ 그리고 포트란 코드를 통합하는 도구

 

2. pandas (pip install pandas)

구조화된 데이터를 빠르고 쉬우면서도 다양한 형식으로 가공할 수 있는 풍부한 자료 구조와 함수를 제공

 

3. matplotlib (pip install matplotlib [or] pip install -m matpoltlib)

그래프나 2차원 데이터 시각화를 생성하는 유명한 파이썬 라이브러리

 

4. IPython (pip install IPython)

표준 과학계산용 파이썬 도구 모음에 포함된 컴포넌트

· IPython을 웹브라우저와 연결할 수 있는 Mathematica 스타일의 HTML 노트북 기능

· 그래프를 즉시 그려보거나 여러 줄을 편집할 수 있는 기능 그리고 문법 강조 기능을 가진 Qt 프레임워크 기반의 GUI 콘솔

· 병렬 분산 컴퓨팅을 위한 기반 구조

· Tutorial : https://plot.ly/python/ipython-notebook-tutorial/

 

5. SciPy (pip install SciPy)

과학계산 컴퓨팅 영역의 여러 기본 문제를 다루는 패키지 모음

· scipy.integrate : 수치적분 루틴과 미분방정식 해법기

· scipy.linalg : numpy.linalg에서 제공하는 것보다 더 확장된 선형대수 루틴과 매트릭스 분해

· scipy.optimize : 함수 최적화기와 방정식의 근을 구하는 알고리즘

· scipy.signal : 시그널 프로세싱 도구

· scipy.sparse : 희소 행렬과 희소 선형 시스템 풀이법

· scipy.special : 감마 함수처럼 흔히 사용되는 수학 함수를 구현한 포트란 라이브러리인 SPECFUN 확장

· scipy.stats : 표준 연속/이산 확률 분포(집적도 함수, 샘플러, 연속 분포 함수)와 다양한 통계 테스트 그리고 좀 더 기술적인 통계 도구

· scipy.weave : 배열 계산을 빠르게 하기 위한 인라인 c++ 코드를 사용하는 도구

 

6. jupyter (pip install jupyter)

matplotlib을 활용하기 위해서 설치해야 하는 라이브러리

ipython notebook을 사용하려면 jupyter를 설치해야 합니다.

notebook은 Interative IDE이며, 향후 활용해야 하므로 미리 설치 합니다.

 

7. Matplotlib (pip install Matplotlib)

그래프를 활용하기 위해서 사용하는 필수 라이브러리

설치 할 경우 대소문자를 구문하니 반드시 "M"을 대 문자로 표시 해야 합니다.

 

이 모든 것이 포함된 도구는 아나콘다(Anaconda)라는 시스템이 있습니다.

 

https://www.continuum.io/downloads#_windows

 

 

추가적으로 프롬포트상의 highlighting을 적용하고 싶다면 다음의 패키지를 설치하면 됩니다.

distribute (pip install distribute)

pyreadline (pip install pyreadline)

반응형
반응형

Doing Data Science 책을 활용하기 때문에 책에서 사용하는 분석 환경을 맞추겠습니다.

Doing Data Science에서는 R + R Studio를 사용하고 있습니다.

 

따라서, R + R Studio를 설치합니다.

 

https://cran.r-project.org/

 

설치를 하고, 실행 하는 과정에서 간단한 기초 명령어를 소개 합니다.

 

1. Package 설치

Install.Package("패키지명")

 

Doing Data Scinec 에서 가장 먼저 설치하는 패키지가 "doBy" 패키지 입니다.

설치 명령은 다음과 같습니다.

 

install.packages("doBy")

 

2. Excel Passing

Excel을 Passing 하기 위해서는 R Studio를 사용할 땐 Perl을 설치 해야 합니다.

R Studio는 기본적으로 Perl을 활용하여 Excel을 Passing 합니다.

 

https://cran.r-project.org/web/packages/gdata/INSTALL

 

T<-read.xls("Template.xlsx", perl = "C:\\Perl\\bin\\perl.exe")

 

R은 Passing이 불편한 단점이 있다. (물론 제가 모르는 사용 방법이 있으면 R이 더 좋을 지도^^)

그래서, 저는 향후 iPython을 사용할 예정입니다. =)

 

Excel 형식 중에 csv 포멧을 활용하면 보다 쉽게 R Studio에서 Loadding은 가능합니다.

하지만, csv 형태로 하다보면 포멧이 깨지는 경우가 발생하기 때문에 정상적으로 잘 변환 되었는지 확인 작업이 필요합니다. 이점 참고 하시길...

 

Excel 파일 내용 정제 작업

 

> bk$gross.sqft <- as.numeric(gsub("[^[:digit:]]","",bk$gross.square.feet))
> bk$land.sqft <- as.numeric(gsub("[^[:digit:]]","",bk$land.square.feet))
> bk$sale.date <- as.Date(bk$sale.date)
> bk$year.built <- as.numeric(as.character(bk$year.built))

 

 

 

반응형
반응형

Data Sicence라는 말이 무엇인지 모르고 시작한 과정에서 점차 조금씩 Data Sicencer로 가는 과정을 정리하려고 합니다.

 

Data Sicence란 무엇인가?

Data Sicence는 흔히 한국에서 이야기 하는 데이터 마이닝을 일컫는 학문입니다. 데이터를 기반으로 수학적 통계를 활용하여 소프트웨어적으로 표현하는 과정을 의미합니다.

 

데이터 과학자 : 어떠한 소프트웨어 공학자보다 통계학을 잘 알고 어떠한 통계학자보다 소프트웨어 공학을 잘 아는 사람. - 조시 월스

 

말이 어렵죠.

저도 어렵네요.

 

그래서도 시작하는 단계이므로 관련 서적이 있으면 좋겠죠?

 

http://book.naver.com/bookdb/book_detail.nhn?bid=7363405

 

 

무슨 말인지 모르지만, 그냥 처음부터 끝까지 읽는 것이 첫번째 목표 입니다.

그 뒤엔 또 시간 나면 다시 읽고, 다음 책으로 넘어갈 예정입니다.

 

앞으로 볼 책은 다음과 같습니다.

 

1. Doing Data Science

2. Python for Data Analysis

3. The R Book

4. R Cookbook

5. MNIST Tutorial

6. 파이썬과 Jupyter Notebook 2/e (교육 자료로 활용 좋음/예제 많음.)

 

R은 아무래도 Data Sicence에서 가장 기본적으로 사용하는 것이므로 모르는 것 보다는 활용 방법에 대해서 알아두고

바이블 형태로 찾아가기 위해서 익히는 과정을 연습할 예정입니다.

Python for Data Analysis는 iPython을 활용하여 분석할 예정이므로 아직 어떠한 그림도 그려지지 않았습니다.

그림이 그려지면 다시 등장하죠~^^

 

그럼 또 다른 게시물이 나오길 바라며~!

See you next time~~

 

반응형
반응형

삽질은 삽질로써 의미가 있다.

 

4byte 먼저 돌리고, 2byte씩 돌리는 방식

하지만, 동일한 값이 중간에 나오므로 이상한 문자가 나오면 따로 분리하여 결과물을 확인 해야함.

 

 

 

반응형
반응형

참고 코드이므로,

참고하세요~^^

 

 

DWORD* address = 0;

DWORD hTest = (DWORD)GetModuleHandle("test.dll");
DWORD addressTable = 0x1019301;


memcpy(&address, (void*)(addressTable+2), 4);   <---- 여기가 중요
 
DWORD dwTest1                 = address[35];
DWORD dwTest2                  = address[71];
DWORD dwTest3                  = address[83];
DWORD dwTest4                  = address[40];
DWORD dwTest5                  = address[50];

 

 

 

참고사항 임....

 

반응형

'프로그래밍 > API/MFC Source' 카테고리의 다른 글

Data Conversions  (0) 2012.07.31
[MFC] ListControl 컬럼 추가  (0) 2012.06.07
[MFC] 폴더 선택 함수  (0) 2012.06.04
반응형

 

도대체 왜 안되는 걸까에서 보름을 잡아 먹은 것 같다.

이런 저런 고민 끝에 문제가 해결 됐다.

 

문제는 취약한 파일의 이슈

그리고 전체적인 구조 파악을 하지 못 한 것들....

 

코드를 보고 계속 탐구 한 끝에 File Fuzzer v.0.1을 만들었다.

 

 

 

아직, 수정해야 하는 부분이 남아 있다.

crash가 발생하고 먼저 죽어버리는 상황이 발생 한다.

모니터링 함수 내부에서 종료 하는 함수로 인해서 비정상적으로 종료 되어 해당 내용을 수정 해야 한다.

 

 

그래도 성공 하였으니, 일단 v.0.1 버전으로 올리도록 하겠다.

환경은 Windows 7/Python v.2.7을 사용하였다.

반응형
반응형

 

gray hat python의 마지막 부분인 pydbg를 이용한 danger_track.py을 실행하게 되면

어떻게 테스트 해야 할지 모르게 된다.

 

그래서 간단한 buffer_overflow.py를 이용하여, 찍히는 로그를 확인 할 수 있다.

 

# -*- coding: cp949 -*-

from ctypes import *
import os

msvcrt = cdll.msvcrt

print ('this is process : %d (0x%04x)' % (os.getpid(), os.getpid()) )
raw_input ('Once the dubber is attached, press any key.')

buffer = c_char_p("AAAAA")
overflow = "A" * 1000000

msvcrt.strcpy(buffer, overflow)

 

위의 내용을 기반으로 돌리게 되면, bof는 발생하나 EIP 부분이 바뀌지 않는 것을 확인 할 수 있다.

 

CONTEXT DUMP
  EIP: 1e0acf39 mov esi,[eax]
  EAX: 41414141 (1094795585) -> N/A
  EBX: 00000009 (         9) -> N/A
  ECX: 00bc6000 (  12345344) -> BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (heap)
  EDX: 41414141 (1094795585) -> N/A
  EDI: 0000004c (        76) -> N/A
  ESI: 1d1b0dca ( 488312266) -> N/A
  EBP: 1d1b0dc8 ( 488312264) -> N/A
  ESP: 0021fb1c (   2226972) -> 7>L747,!STx!,!8Tx!!p;p!P!`wp?@W$!P!=!! (stack)
  +00: 1d1b0dca ( 488312266) -> N/A
  +04: 00000000 (         0) -> N/A
  +08: 00000037 (        55) -> N/A
  +0c: 1e0b3e9e ( 504053406) -> N/A
  +10: 0000004c (        76) -> N/A
  +14: 1d1b0dca ( 488312266) -> N/A

 

EIP가 바뀌지 않으면 까다로운 작업이 되므로, 눈으로 쉽게 확인 할 수 있는 방법은 EIP가 덮이느냐, 덮히지 않느냐를 확인하는 것이 나에겐 무지 중요한 부분이다.

(이후에서는 crash만 나더라도 더 명확하게 되는건지 확인 할 수 있겠지만 현재로는 EIP를 기반으로 찾고 있다.)

 

그러던 중, war-ftpd v.1.65 프로그램을 구한 뒤 테스트를 진행 하였다.

war-ftpd는 다행히도 EIP가 덮어졌다.

CONTEXT DUMP
  EIP: 41414141 Unable to disassemble at 41414141
  EAX: 00000000 (         0) -> N/A
  EBX: 00000000 (         0) -> N/A
  ECX: 41414141 (1094795585) -> N/A
  EDX: 7c9332bc (2090021564) -> N/A
  EDI: 00000000 (         0) -> N/A
  ESI: 00000000 (         0) -> N/A
  EBP: 00aebf18 (  11452184) -> N/A
  ESP: 00aebef8 (  11452152) -> 2|2|z2|AAAA|AAAAkc~`LPD@;hL@;|x;x;j|AAAA (heap)
  +00: 7c9332a8 (2090021544) -> N/A
  +04: 00aebfe0 (  11452384) -> AAAAAAAA?@=&HZppppeH8x???;##2|AAAAAAAAF#@=&HZ (heap)
  +08: 00aefd94 (  11468180) -> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (stack)
  +0c: 00aebffc (  11452412) -> ?@=&HZppppeH8x???;##2|AAAAAAAAF#@=&HZpppp (heap)
  +10: 00aebfb4 (  11452340) -> j|AAAAAAAA?@=&HZppppeH8x???;##2|AAAA (heap)
  +14: 00aec2dc (  11453148) -> 2|z2|AAAA|AAAAj|AAAAAAAA? (stack)

 

아주 ESP까지 덕지 덕지 붙어져 있는 것을 확인 할 수 있다.

danger_track은 tracking을 하기 위한 모니터링 툴이다. 즉, 어디에서 크래쉬가 발생하였는지에 대한 메모리 참조를 하기 위한 도구이지 fuzzing 도구가 아닌다. (fuzzing 도구인지 알고 무쟈게 즐거워했는데..ㅡㅡ;;)

 

이 것으로 danger_track 테스트를 마무리 하겠다.

즐거운 하루 되시길....

 

Tip : 누구든 생각하겠죠? danger_track은 print로 출력 하고 있습니다. 그 부분을 파일로 떨구면 보기도 편하고

또한, 파일명으로 dump 파일을 생성하면 추후에 다양한 내용들을 dump 하더라도 섞일 염려가 없으니 참고하시길....

관련 코드는 아래와 같습니다.

 

proc_name = psutil.Process(pid)
targetFile_Name = proc_name.name + '_crash_dump.txt'
output_fw = file(targetFile_Name, 'w')
반응형
반응형

이늠의 pydbg는 언제쯤 내 맘대로 움직일까..ㅡ.ㅡ;;

일단 동작은 하는데 영 찜찜하게 끝났네....

 

우선, MEM_IMAGE를 snap 을 안 떠서 crash 계속 나고 원인 찾는다고

삽질의 삽질 한 끝에 좋은 사이트 하나 얻었고, 해당 내용을 적용하니 되긴 된다.

 

http://linkc.tistory.com/entry/Analysis-about-Pydbg-Snapshot

 

            # do not snapshot blocks of memory that match the following characteristics.
            # XXX - might want to drop the MEM_IMAGE check to accomodate for self modifying code.
            #if mbi.State != MEM_COMMIT or mbi.Type == MEM_IMAGE:
            if mbi.State != MEM_COMMIT:

- pydbg.py 수정 -

 

또한, pydbg에서 self._log()를 출력하는데 내용이 안나오는 이유는 상단에 아래와 같은 코드로 막아 놓았기 때문이다.

 

self._log = lambda msg: None #sys.stderr.write("PDBG_LOG> " + msg + "\n")

-> self._log = lambda msg: sys.stderr.write("PDBG_LOG> " + msg + "\n")

 

XP에서는 잘 되는데....Win 7에서는 안되는 이유...ㅡ.ㅡ

파라매터가 잘못 됐다????

 

GetLastError : 87 (0x57)

ERROR_INVALID_PARAMETER
 

 

 

위와 같은 에러가 발생하지만 정상적으로 동작은 된다.

 

적용은 되는데, 저 에러코드를 못 잡겠는데 누가 잡은 사람 있는 사람~~~

댓글 남겨주셈~~T-T

please. anybody is request me to solution picture T-T

have a good day.

반응형
반응형

These instructions are for Windows XP => Windows 7 using Python 2.7 (though other versions should work too)

Thanks to louppen for the great starting point!

  1. Download and install MinGW Compilier v20101030
    • Make sure to use pre-packaged repo catalogs and the old version! PyDasm barfs when compiling because MinGW32 removed support for -mno-cygwin! Bug Report
    • On the "Select Components" dialog check C++ Compiler and ObjC Compiler in addition to selected by default set
  2. Download and install Python 2.7 (x64)
  3. Download and install Git for windows
    • Make sure it adds git to your path variable!
  4. Update $PATH to include C:\Python27 and C:\MinGW\bin KB article
  5. Checkout pydbg

    C:\sulley_build>git clone https://Fitblip@github.com/Fitblip/pydbg.git
    Cloning into 'pydbg'...
    remote: Counting objects: 17, done.
    remote: Compressing objects: 100% (12/12), done.
    remote: Total 17 (delta 4), reused 17 (delta 4)
    Unpacking objects: 100% (17/17), done.
    
  6. Build pydbg

    C:\sulley_build\pydbg>python setup.py install
    running install
    running build
    running build_py
    creating build
    creating build\lib
    creating build\lib\pydbg
    ...snip...
    running install_egg_info
    Removing C:\python27\Lib\site-packages\pydbg-0.0.0-py2.7.egg-info
    Writing C:\python27\Lib\site-packages\pydbg-0.0.0-py2.7.egg-info
    
  7. Download and extract libdasm

  8. Build the extention and install it (beware of gcc version 4.7.x removed support for -mno-cygwin, seehttp://stackoverflow.com/q/6034390/333353 and https://gist.github.com/4466320 for a fix)

    C:\sulley_build\libdisasm\pydasm>python setup.py build_ext -c mingw32
    running build_ext
    building 'pydasm' extension
    ...snip...
    C:\sulley_build\libdisasm\pydasm>python setup.py install
    running install
    running build
    running build_ext
    running install_lib
    copying build\lib.win32-2.7\pydasm.pyd -> C:\python27\Lib\site-packages
    running install_egg_info
    Writing C:\python27\Lib\site-packages\pydasm-1.5-py2.7.egg-info
    
  9. Checkout Sulley

    C:\sulley_build>git clone https://github.com/OpenRCE/sulley.git
    Cloning into 'sulley'...
    remote: Counting objects: 148, done.
    remote: Compressing objects: 100% (91/91), done.
    remote: Total 148 (delta 53), reused 146 (delta 51)
    Receiving objects: 100% (148/148), 267.03 KiB, done.
    Resolving deltas: 100% (53/53), done.
    
  10. Make sure process_monitor.py works (no import errors)

     C:\sulley_build\sulley>python process_monitor.py
     ERR> USAGE: process_monitor.py
         <-c|--crash_bin FILENAME> filename to serialize crash bin class to
         [-p|--proc_name NAME]     process name to search for and attach to
         [-i|--ignore_pid PID]     ignore this PID when searching for the target process
         [-l|--log_level LEVEL]    log level (default 1), increase for more verbosity
         [--port PORT]             TCP port to bind this agent to
    
  11. Download and extract PCapy

  12. Download and extract WinPcap Dev Kit (I put mine in C:\sulley_build\WpdPack)

  13. Build PCapy (pointing to WinPcap's include and lib directories) and install it

    C:\sulley_build\pcapy-0.10.5>python setup.py build_ext -c mingw32 -I "C:\sulley_build\WpdPack\Include" -L "C:\sulley_build\WpdPack\Lib"
    running build_ext
    building 'pcapy' extension
    creating build
    creating build\temp.win32-2.7
    creating build\temp.win32-2.7\Release
    creating build\temp.win32-2.7\Release\win32
    ...snip...
    C:\sulley_build\pcapy-0.10.5>python setup.py install
    running install
    running build
    running build_ext
    running install_lib
    copying build\lib.win32-2.7\pcapy.pyd -> C:\python27\Lib\site-packages
    running install_data
    creating C:\python27\share
    creating C:\python27\share\doc
    creating C:\python27\share\doc\pcapy
    copying README -> C:\python27\share\doc\pcapy
    copying LICENSE -> C:\python27\share\doc\pcapy
    copying pcapy.html -> C:\python27\share\doc\pcapy
    running install_egg_info
    Writing C:\python27\Lib\site-packages\pcapy-0.10.5-py2.7.egg-info
    
  14. Download and install WinPcap

  15. Download and extract Impacket

  16. Install Impacket

    C:\sulley_build\Impacket-0.9.6.0>python setup.py install
    running install
    running build
    running build_py
    creating build
    creating build\lib
    creating build\lib\impacket
    copying impacket\ImpactDecoder.py -> build\lib\impacket
    copying impacket\ImpactPacket.py -> build\lib\impacket
    copying impacket\nmb.py -> build\lib\impacket
    copying impacket\ntlm.py -> build\lib\impacket
    copying impacket\smb.py -> build\lib\impacket
    copying impacket\structure.py -> build\lib\impacket
    copying impacket\uuid.py -> build\lib\impacket
    copying impacket\__init__.py -> build\lib\impacket
    creating build\lib\impacket\dcerpc
    ...snip...
    
  17. Check to make sure network_monitor.py works

    C:\sulley_build\sulley>python network_monitor.py
    ERR> USAGE: network_monitor.py
        <-d|--device DEVICE #>    device to sniff on (see list below)
        [-f|--filter PCAP FILTER] BPF filter string
        [-P|--log_path PATH]      log directory to store pcaps to
        [-l|--log_level LEVEL]    log level (default 1), increase for more verbosity
    
        [--port PORT]             TCP port to bind this agent to
    
    Network Device List:
        [0] \Device\NPF_GenericDialupAdapter
        [1] {CF0B388B-8DF5-4BC4-8ECF-404F2A1B489C}  10.0.2.64


반응형
반응형


이걸 가지고 얼마나 삽질을 했던가...


msvcrt.printf ("Count : %d", count++)


msvcrt.printf("Count : %d" % count++)


도대체 무엇이 틀린까 고민하던 끝에 ollydbg를 통해서 스택 구조를 확인 해 보았다.

이런...이런....된장~~!!

겁나 삽질 할 필요도 없는 내용이 나오게 되었다.


msvcrt.printf ("Count : %d", count++)


    # CPU Stack

    # Address   Value      ASCII Comments

    # 0021FB0C  /1D1ADC9A  ; RETURN to _ctypes_pyd.1D1ADC9A

    # 0021FB10  |01A16BA4  ; ASCII "Loop iteration %d!"

    # 0021FB14  |00000002   ; 


msvcrt.printf("Count : %d" % count++)


    # CPU Stack

    # Address   Value      ASCII Comments

    # 0021FB20  /1D1ADC9A  ; RETURN to _ctypes_pyd.1D1ADC9A

    # 0021FB24  |019A88A4  ; ASCII "Loop iteration 0!"


자, 보이시는가?

C방식으로 호출 할 때는 ESP + 0x08 위치에 2번째 아큐먼트 값이 들어가고,

python 방식으로 호출할 때는 ESP + 0x04 위치에 이미 만들어진 아큐먼트 값이 들어가 있다.


따라서, python pydbg를 이용한 예제에서 아무리 ESP+0x08의 값을 가지고 삽질을 해봐야 답이 나오지 않는다.

그래서 아래와 같이 수정을 해야 한다.

(해당 내용은 나보다 먼저 고민하고 작성한 중국인이 있었다. 그 분에게 다시 한번 감사를 표한다. 

thank you so much wanglong1982http://shellcodes.sinaapp.com/articles/date/2013/05)


   # python 방식(printf "%s" % buff)에서는 ESP+0x04가 인자의 위치이다.

    # CPU Stack

    # Address   Value      ASCII Comments

    # 0021FB20  /1D1ADC9A  ; RETURN to _ctypes_pyd.1D1ADC9A

    # 0021FB24  |019A88A4  ; ASCII "Loop iteration 0!"

    # 또한, 인자는 이미 합쳐진 내용이 표현되며, c 호출 방식과 차이가 난다.


    # ESP + 0x04 인자의 주소를 읽어 드림.

    parameter_addr = dbg.context.Esp + 0x04

    print ('context EIP : 0x%08x' % dbg.context.Eip)

    print ('context ESP : 0x%08x' % dbg.context.Esp)

    print ('parameter address : 0x%08x' % parameter_addr)


    counter = dbg.read_process_memory(parameter_addr, 4)


    # read_process_memory는 패킹된 바이너리 문자열을 리턴한다.

    # 따라서 그것을 사용하기 전에 먼저 언팩을 수행해야 한다.

    string_addr = struct.unpack("L", counter)[0]


    # "Loop iteration %d!\n" = 20byte

    # 다 문자열 이기 때문에 공백까지 포함해서 20byte 계산

    str_len = 15 + 3 + 2


# 문자열이 존재하는 위치를 알았으니, 해당 문자열의 주소에 문자열 사이즈 만큼 얻어옮.

    counter_string = dbg.read_process_memory(string_addr, int(str_len))

    counter_string = struct.unpack(str(str_len) + "s", counter_string)[0]

# "!\n" 내용은 필요 없으므로 제거.

    counter_string = counter_string.split("!\n")[0]


    # counter_string 에서 앞에서 15 자리까지 버리고 다음부터 자리 가지고 옴.

    counter = counter_string[15:]

    print "Counter: %d" % int(counter)

# 랜덤한 숫자를 생성

    random_counter = str(random.randint(1, 100))

# 생성된 숫자를 "Loop iteration" 이후 주소에 기록

    dbg.write_process_memory(string_addr + 0x0F, random_counter)


위와 같은 코드를 이용하면 아래와 같은 내용을 얻을 수 있다.




C로 호출하는 방식은 책에 있는 내용을 그대로 인용하면 되므로 추가적으로 언급하지 않겠다.

python 형태로 호출할 때 유념하고, 또한 python 형태로 호출하더라도 수정 될 수 있는 내용이 이므로 포기하지 말고 

마무리 짓길 바란다.


반응형

+ Recent posts