반응형
핀툴 홈페이지
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 |