y0u_bat

[S.S.A] 시스템해킹 스터디 6주차 (pintool) 본문

System

[S.S.A] 시스템해킹 스터디 6주차 (pintool)

유뱃 2015. 11. 22. 10:15






taint progation analysis

유저인풋의 data flow를 죄다 트래킹해서

destination , source instruction pointer 등에

영향을 주는 포인트를 알아냄

tainted destination

tainted source

tainted instruction pointer



sysbolic execution Engine -> klee & constraint solver -> z3 (값구해주는거)

—> path explosion 


concolic execution 

—> conrete excatuion + symbolic execution

conc(rete)+(symb)olic


patch analysis | 1day analysis

-> binary | sure code diffing 

vulnerability extrapolation -> fabian yamaguchi

assisted vulnerably

코드 유사도 비교를 통한 취약점 분석

key concept:

기존에 취약하다고 알려진 코드패턴이 다른 코드베이스에서도 발견이 될 경우

그 코드도 취약할 가능성이 높다

가장 많이 사용되는 분야: 소스코드 표절 탐지







과제 


과제.zip


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
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <fstream>
#include "pin.H"
 
using std::ofstream;
 
ofstream outFile("flag",ios::out);
 
int result_xor=0;
int result_cmp=0;
int i_f;
char result;
 
void test(INS ins,void *v)
{
    ADDRINT address = INS_Address(ins);
 
    if(address >= 0x08048203 && address <= 0x080A3778)
    {
        //outFile<<hex<<address<<' '<< INS_Mnemonic(ins) << endl;
        
        switch(INS_Opcode(ins))
        {
 
            case XED_ICLASS_XOR:    
                result_xor = INS_OperandImmediate(ins,1);        
                i_f = 1;
                break;
 
            case XED_ICLASS_CMP:
                if(i_f == 1)
                {
                    result_cmp = INS_OperandImmediate(ins,1);
                    result = result_xor^result_cmp;
                    outFile<<result;
                    i_f = 0;
 
                }else
                {
                    result = INS_OperandImmediate(ins,1);
                    outFile<<result;
                    i_f = 0;
        
                }
                
        }
 
        INS_Delete(ins);
    }
 
}
 
int main(int argc,char *argv[])
{
    if(PIN_Init(argc,argv)) return -1;
 
    INS_AddInstrumentFunction(test,0);
 
    PIN_StartProgram();
    
    return 0;
}
 
cs






핀툴로  인트럭션의 오퍼랜드를 알아낼수있어서 


xor랑 cmp의 오퍼랜드 알아내서  xor^cmp 해서 뽑으면 된다.


그런데 보면 xor을 안거치는곳이 있으니 조건만 잘 걸어서 해주면 된다.


그리고 base64 20번 돌려주면 키값이 나온다.


Comments