제대로 이해하면서 pin을 사용해본건 처음이라고 봐도 괜찮겠습니다.
dump.txt 파일에 Base64로 20번 인코딩된 키 값이 써지고, 이를 20번 디코딩하면 키 값이 나옵니다.
처음부터 32비트 환경에서 할걸...
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 51 | #include <stdio.h> #include "pin.H" #define start 0x8048223 #define end 0x80A3778 INT32 Usage(){ printf("pin -t MyPinTool.so -- prog\n"); return 1; } int wasXOR = 0; int xorValue = 0; int cmpValue = 0; FILE *p = fopen("dump.txt", "w"); VOID Instruction(INS ins, VOID *v) { ADDRINT addr = INS_Address(ins); if( addr >= start && addr <= end ){ if(INS_Opcode(ins)==XED_ICLASS_CMP && INS_OperandIsImmediate(ins, 1)) { cmpValue = (unsigned int)INS_OperandImmediate(ins, 1); printf("CMP [unknown], 0x%x\n", cmpValue); if(wasXOR) { printf("[*] %c\n", xorValue^cmpValue); wasXOR = 0; fprintf(p, "%c", xorValue^cmpValue); } else { printf("[*] %c\n", cmpValue); fprintf(p, "%c", cmpValue); } } if(INS_Opcode(ins)==XED_ICLASS_XOR && INS_OperandIsImmediate(ins, 1)) { wasXOR = 1; xorValue = (unsigned int)INS_OperandImmediate(ins, 1); printf("XOR 0x%x\n", xorValue); } INS_Delete(ins); } } int main(int argc, char * argv[]) { if (PIN_Init(argc, argv)) return Usage(); INS_AddInstrumentFunction(Instruction, 0); PIN_StartProgram(); fclose(p); return 0; } | cs |
'잡담' 카테고리의 다른 글
무슨 일이든 꾸준히 한다는건 대단하더라 (0) | 2016.03.27 |
---|---|
pthread따위 으으 (0) | 2016.03.18 |
Codegate 2016 Junior 예선 결과 (0) | 2016.03.13 |
요즘 생활에 대한 고찰 (0) | 2016.03.12 |
티스토리로 오고 느낀 점 (0) | 2016.02.12 |