반응형


핀툴 홈페이지

https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool


핀툴(Pin Tool)이란?

- 인텔사에서 만든 x64, i686을 위해서 동적으로 바이너리를 삽입할 수 있게 한 프로그램입니다.


한국에서는 별로 문서가 없는데 이는 모든 메뉴얼이 영어로 되어 있기 때문입니다.

하지만  각각의 기능에 대한 부분은 영어를 조금만 알더라도 쉽게 이해할 수 있을겁니다,

저 같은 경우에는 컴퓨터 쪽 용어를 알고 있어 조금 수월했습니다.

(영어5등급보다 잘하시잖아요)


핀툴의 기능은 쉽게 말해서

어떤 프로그램에서 원하는 코드가 실행될때 무엇이든 할 수 있다는 것입니다.


예시를 들면



이 프로그램은 무려 0x42A0바이트를 일일이 비교하게 됩니다.

이것을 단순 리버싱을 하려면 매우 복잡하게 됩니다.

이때 PinTool을 사용할 수 있습니다.


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<iostream>
#include<fstream>
#include "pin.H"
#define START 0x8048202
#define END 0x80A3778
using namespace std;
ofstream out("flag");
long long int iXor,iCmp;
void Instruction(INS ins, void *v)
{
        // INS_Address 현제 주소를 구해온다.
        ADDRINT Address = INS_Address(ins);
        // 원하는 범위 한정
        if(START<=Address && Address<=END)
        {
                char cAns;
                // INS_Opcode 현제 주소의 Opcode를 구해온다.
                switch(INS_Opcode(ins))
                {
                // 만약 XOR이라면
                case XED_ICLASS_XOR:
                        // Immediate를 가지고 온다.
                        iXor = INS_OperandImmediate(ins,1);
                        break;
                // 만약 CMP라면
                case XED_ICLASS_CMP:
                        // Immediate를 가지고 온다.
                        iCmp = INS_OperandImmediate(ins,1);
                        cAns = iXor^iCmp;
                        // 출력
                        out<<cAns;
                        iXor=0;
                        break;
                }
                // 명령어 삭제로 다음명령어 강제 실행
                INS_Delete(ins);
        }
}
int main(int argc, char* argv[])
{
        // 핀툴 초기화
        if(PIN_Init(argc,argv)) return -1;
        // CallBack 함수 추가   
        INS_AddInstrumentFunction(Instruction, 0);
        // 프로그램 시작
        PIN_StartProgram();
        return 0;
}
 
 
cs


이렇게 하면 빌드를 하게 되면

윈도우라면 DLL파일 리눅스라면 SO파일이 나올 것입니다.

이 빌드파일을 가지고 실행시키는 방법은

pin.exe -t <빌드파일 주소> -- <실행 파일>

입니다.


위 소스라면 같은 폴더에 flag라는 파일에 키가 문자열로 있을 것입니다. 




'Pwnable > Etc' 카테고리의 다른 글

Docker & Docker Compose 설치법  (0) 2017.05.05
BFF Fuzzer 약간설명&옵션설명  (1) 2016.02.17
SongSari - Basic Bof  (0) 2015.12.01
Layer7 CTF SPILL  (0) 2015.11.02
PlaidCTF-2013 pork  (0) 2015.10.28

+ Recent posts