'pydbg'에 해당되는 글 2건

  1. 2011.05.18 Analysis about Pydbg Snapshot (1)
  2. 2010.05.10 [ Paimei ] Reverse Engineering Frame Work (2)

2011.05.18 16:31 System

[+] Introduction


 Pydbg. 요즘들어 주목 받고 있는 Script 언어 중 하나인 Python의 Debugging Module 입니다.

Python 언어 자체가 심플하고 이해하기 쉽기 때문에 이를 이용하나 Pydbg도 상당히 접근하기 용이합니다.

물론 Python의 고질적인 문제인 속도는 안고 가야 할 문제입니다만..

이번 포스팅에서는 Pydbg의 Snapshot 기능이 가지고 있는 문제점에 대해서 써볼까 합니다.

Snapshot 기능에 대해 간단히 설명하자면 말그대로 특정 지점의 정보를 Snapshot 찍듯이 찍고

Restore를 통해 찍은 시점으로 돌아가는 거라고 보시면 되겠네요.

예를 들어서 금요일 저녁에 Snapshot을 찍어놓고 

일요일 저녁에 저장해뒀던 Snapshot으로 Restore 하는거죠.

...


<Fig0. 울지마라>

상당히 유용한 기능입니다.

특정 루틴을 반복하는데 좋겠죠? 

아무튼 해당 기능을 사용하는데 약간 문제가 있는데요,

첫번째는 Pydbg File 자체를 수정하지 않고 일어나는 문제점을 해결 하는 방법이고

두번째는 Pydbg File 자체를 수정하는 방법입니다.

간단하기로는 후자가 간단합니다. 단 두글자만 수정하면 끝나요.

포스팅은 전자에 중점을 두고 기술하도록 하겠습니다.




[+] Problem


snapshot의 사용방법은 간단합니다.

pydbg의 객체의 process_snapshot() method를 호출해주면 되죠

복구는 process_restore() 입니다.

그리고 해당 method를 호출해주기 전에

모든 thread를 멈추고 snapshot해야 한다고 pydbg의 제작자 pedram amini 가 명시하고 있습니다

그러니까 이런 식으로 해야겠죠.

SnapShot

dbg.suspend_all_threads()

dbg.process_snapshot()

dbg.resume_all_threads()


Restore 

dbg.suspend_all_threads()

dbg.process_restore()

dbg.resume_all_threads()



예제를 통해 문제를 살펴보죠.

간단한 문자열을 출력하는 다음과 같은 코드가 있습니다.

여기서는 puts를 이용하였으나, printf 문도 동일한 문제가 일어납니다.


*해당 문제는 VS2010의 msvcr100.dll 에서는 발생하지 않습니다만

Windows의 기본 C- Runtime Libary인 msvcrt.dll 을 썼을때는 해당 문제가 발생합니다.

확인해보면  msvcr100.dll에서는 별도의 예외처리가 들어갑니다. 

해당 예외 원인은 뒤에서 설명하도록 하죠.




<Fig1.  예제 프로그램>

Friday nigth에 snapshot 을 찍고

Sunday night 에 restore를 해보면

정상적으로 작동하지 않는걸 확인해볼 수 있습니다.

<Fig2. 정상적으로 출력되지 않고 종료된 모습>
 
나머지도 출력이 되지 않는걸로 봐선 Handling 되지 않는 예외가 발생하여 프로그램이

죽었다고 보면 되겠죠.

발생하는 예외의 Call Stack을 확인해보면

EnterCriticalSection 이후에 발생하는 것을 볼 수 있습니다.

예외가 나는 경우를 확인해보면 항상 같은 곳에서 발생하지는 않습니다만

EnterCriticalSection 함수에 진입하고 나서 발생하는것은 변함이 없습니다.

EnterCriticalSection?

동기화를 위해 사용되는 방법중 임계영역[  Critical Section ] 을 이용하는데 사용되는 함수입니다.

단일 Thread 프로그램인데 무슨 동기화냐 하시는분이 계실지도 모르겠는데

기본적인 Console 출력 함수들은 모두 동기화 작업을 거칩니다. 



왜 이런 문제가 발생할까요?


[+] Analysis


예외 원인을 보면 Access Violation이 주로 일어납니다.

일단 Snapshot method가 호출되었을 때 저장되는 내용을 한번 살펴보겠습니다.


<Fig3. 각 Thread의 Context를 get_thread_context를 통해 저장한 모습>

Context에는 어떤 내용이 저장되는고 하니

<Fig4. WinNT.h에 있는 CONTEXT Structure의 구조>
 

해당 함수에서는 CPU Register를 저장합니다. 

이후 메모리를 돌며 쓰기가 불가능한 곳과 실행파일 이미지를 제외한 영역을 저장합니다.


 <Fig5. 쓰기 가능한 메모리 영역을 저장하는 부분>

 바로 이곳이 문제입니다.

 stack 값이나 Register 영역 값은 모두 정상적으로 복구되는데 실행 파일 이미지에 저장되는 변수는 그대로 남아있는 것입니다.

 즉, data 영역에 저장되는 전역변수가 문제가 될 수 있다는 거죠.

Critical Section의 구조를 살펴봅시다.

<Fig6. Critical Section 구조체의 모습>

첫번째 member를 보면  _RTL_CRITICAL_SECTION_DEBUG 이라는 Linked List 형태의 구조체를 가리키고 있는

포인터 임을 확인 할 수 있습니다.

자 그렇다면 정리해봅시다.

전역변수로 지정된 Critical Section 구조체는 Restore 되어도 변하지 않습니다.

그대로 남아있다는 소리죠.

그런데 해당 구조체가 가리키고 있는 _RTL_CRITICAL_SECTION_DEBUG 구조체는 

Restore 되면 Snapshot 될 때의 상태로 돌아가게 됩니다.

즉 , InitializeCriticalSection이 호출되기 전 상태로 돌아간다는 말입니다.

여기서 문제가 일어납니다.

전역 변수를 참조해보았을때 , 이미 Initialize 된 Critical Section 이 있는 것을 확인됩니다.

이를 사용했더니 실제로는 Initialize 되지 않는 Critical Section 이라는 거죠.

그 포인터가 가리키는 쓰레기 값을 가지고 연산을 했으니 Error가 나는게 당연했겠죠?

여기서 프로그램마다 메모리 값이 다르니 예외가 발생하는 곳도 달랐을 겁니다.

정리하자면, 해당 변수는 정상적으로 Restore 되지 않았는데 가리키는 영역은 Restore 되었다는 거죠.

물론 EnterCritialSection 안에서 나는건 공통적입니다만..

위 사항은 Console 출력 함수에서 적용되는 문제입니다.

Image 영역에 있는 메모리에 있는 변수에 접근하는 모든 것이 문제가 될 수 있습니다.

예를 들면 File Pointer 연산이 있겠죠




 [+] Solution  

 
1.  Snapshot을 찍을때 Image 영역까지 합니다.
 
가장 심플하고 간단하죠.

모든 전역변수도 정상적으로 변경이 되구요

Pedram Amini가 왜 Image 영역을 막아뒀는지는 모르겠습니다만

pydbg를 보면 필요하면 해제하라고 명시되어있습니다.

흠.. 다른 문제가 생길 수 있을지는 좀 더 봐야 할거 같네요.


2. 해당 변수의 snapshot 상태로 직접 돌려준다.

Console 출력 함수들의 경우 해당 Critical Section 영역을 0으로 덮어버리면 알아서 다시 할당하기 때문에

문제가 일어나지 않습니다.

File Pointer의 경우 현재 위치를 가리키고 있는 포인터를 원하는 위치로 돌려주는 식으로 우회가 가능하겠습니다.

좀 번거롭죠. 사용하는 함수마다 이렇게 해 줘야 하는 불편함이 있구요.



3. Image 영역에 쓰는 변수에 접근하지 않는다.

.... 

네 피하면 되는겁니다.

핵심적인 부분만 Snapshot , Restore 합니다. 

지역변수 연산만 한다면 이 방법이 먹히겠죠.

어떠한 수정도 없지만 그만큼 한계가 있는 방식입니다.



<Fig7. 이게 꿈이라고 말하지 말아주세요>

 


Posted by LinkC

2010.05.10 15:27 Etc../Tool



네 , Paimei 는 킬빌 2에 나오는 캐릭터입니다











이 아니라

소개할 건 Reverse Engineering Frame work 입니다

아마 Python 을 의미하는 Py 와 발음이 비슷한 Pai 떄문에

기존에 있던 Paimei 란 캐릭터의 이름을 따와서 이름을 지은거 같군요

아무튼 상당히 괜찮다고 평이 나있는 툴입니다

오픈소스이구요

먼저 Paimei 가 어떤 툴인지는 알고 설치 하셔야겠죠?

제작자의 홈페이지 입니다

http://pedram.redhive.com/PyDbg/docs/index.html

그리고 이건 다른 분들이 작성하신 Tutorial~

http://www.crazylazy.info/blog/content/paimei-tutorial-hands-pydbg-part-1
http://www.crazylazy.info/blog/content/paimei-tutorial-simple-heap-traceing-part-2

또 RECON 2006 에서 제작자가 발표한  PDF 파일입니다

http://recon.cx/en/f/pamini-five-finger.pdf

근데 생각보다 설치하기가 좀 [ 많이 ] 까다롭더군요

선행 설치되야 하는것도 장난이 아닙니다

태그를 긁어왔는데 어째 선이 안보여서 그림으로 대체합니다 -_-



이는 제작자 페이지의 Installation 부분에서 발췌한것임을 알려드립니다

게다가 이는 Python 2.4 를 기준으로 되어 있기 때문에 약간의 수정 없이는

요즘 가장 대중적으로 쓰이는 2.5에서 오류 없이 깔기가 불가능합니다

음 그럼 설치를 시작해볼까요

http://www.openrce.org/downloads/details/208/PaiMei

에서 Paimei 를 받습니다

물론 Python 2.5 가 깔려있다는 전제하에서 하는 거구요

위 파일에서 __install_requirements 를 실행시키면 한번에 다 설치 할 수 있도록 했는데

2.4 기준이라 위 링크된 사이트에서 자신의 버전에 맞는 파일을 받아 설치하시는게

속 편하실거라고 봅니다 -,.-

아무튼 위 설치를 마치셨다면

__setup_mysql.py를 실행시켜서 db와 연결하셔야 합니다

__setup_mysql.py localhost <ID> <PassWord> 로 실행시켜주시면 됩니다


ID, Password 는 Mysql 계정정보를 입력시켜주시면 되구요

이제 __build_installer.bat 파일을 실행시켜야 합니다

저는 setup.py install 명령어를 쓰고 나선 한참 삽질했는데요

setup.py install 하면서 컴파일러가 다르다니 어쨌대니 mingw32 를 쓰라느니

그래서 cygwin 도 깔아보고 해봤는데도 안되고

나중에 찾아보니 mingw32를 써서 컴파일하는건 좀 불안정하다더군요

아무튼 이런 삽질을 피하시려면

__build_installer.bat 을 실행시키면 됩니다

물론 수정점이 있지요

c:\python\python.exe setup.py bdist_wininst --bitmap=logos\installer.bmp --title=PaiMei

를 이렇게

c:\python25\python.exe setup.py bdist_wininst --bitmap=logos\installer.bmp --title=PaiMei


바꿔주시면 됩니다

그리고 실행해주시면 주르륵 설치가 되지요

확인은 default 로 설정해주셨을때

C:\Python25\Lib\site-packages

에서 확인하실 수 있습니다

pida, pydbg, pgraph, MySqLdb 등등이 있어야 하구요

아참, 제 기억으론 setuptools 도 필요했던거 같네요

http://pypi.python.org/pypi/setuptools

버전 맞게 설치하시고

pydbg 에서 또  수정해주셔야 할게 있는데

beist lab의 ashine 님의 글을 참조하시면 OK~

http://ashine.springnote.com/pages/5585579?print=1



이제 Paimei 압축을 푼 폴더에 console 폴더에 들어가셔서

PAIMEIconsole.pyw 를 실행시키면



Paimei 님의 살인미소가 우리를 반겨주시는게 정상입니다



Paimei 의 실행모습입니다

전체적으로 깔끔한 인터페이스네요

이걸 또 PIDA 와 연결 할 수 있는데요

조심하실 점은

Paimei 의 PIDA 이외에

동일 이름을 가진 module 이 있다는 점입니다 -.-

저는 아무것도 모르고 Pida 치고 가장 먼저 나온 사이트에서 받아서 설치했었는데

왜 안되는지 한참 삽질했습니다

결국 같은 module이 아니더군요

http://pida.co.uk/

이게 아니니 조심하시길~






제가 Paimei 를   Opensrc에 있는 링크를 걸어 두었는데

googlecode에 svn에 가보니 더 최근의 소스가 있더군요 -,.-

googlecode 상에는 그런 링크 없었는데..  

아무튼

http://paimei.googlecode.com/svn/trunk/

에 가보시면 수정된 파일을 받을 수 있습니다





저걸 일일히 언제 다 받고 있겠습니까

그래서 간단히 python 코드로 짜봤습니다





파일 및 폴더 내용까지 싹 긁어다 오는 소스 입니다

제가 앞서 설명했던 것들을 여차 저차 하게 되면

다음과 같이 몇가지 메뉴가 추가된 Paimei 를 만나실 수 있습니다






Paimei Flash demo 를 보시면

pida 파일을 불러오는 것을 볼 수 있는데요



이 pida 파일은 IDA python 으로 생성된 파일입니다

IDA python 을 설치하시면 IDA 에서 python script를 실행시킬 수 있게되는데

여기서 paimei 폴더에 있는 pida_dump.py를 실행 시키면 얻으실 수 있습니다

혹시 xrefs 의 길이를 구할수 없다는 둥의 에러메세지가 뜨게 되면

xrefs를 list 로 변환해주셔야 합니다

xrefs 가 list 의 레퍼런스 인데 list로 연산을 하더군요

제가 뒤에 언급한 svn 에서는

이점이 변환되도록 수정 되었더군요



구버전으로 이래저래 삽질 많이 했었는데 참 ..



'Etc.. > Tool' 카테고리의 다른 글

[ Paimei ] Reverse Engineering Frame Work  (2) 2010.05.10
[ Dia ] 순서도 작성 프로그램  (2) 2010.04.22
[ NotePad++ ] 단축 실행 , CMD 초기 경로 지정  (0) 2010.04.09
[ Hex Editor ] HxD  (0) 2010.03.19
[ Text Editor ] Notepad++  (0) 2010.03.19
Back Track 4 Final Version Release!  (0) 2010.01.31
Posted by LinkC
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday51
Today46
Total318,336

달력

 « |  » 2018.09
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

최근에 받은 트랙백

글 보관함


. .