Tuuna Computer Science

[디버거] 디버거 제작을 위한 ToDo it List 본문

Debugger

[디버거] 디버거 제작을 위한 ToDo it List

GuTTe 2019. 2. 21. 18:25
일단 ToDo 리스트에서 한것은 X표시하고 안한것은 [] 표시로 빈칸을 뒀는데 한것보다 안한게 많네... ㅎ 
계속 열심히 달려야지. 

[x]ELF 중요한 메타데이터 파싱하기 
[x]ELF 각 각의 심볼 인덱스 입력시 헥스 덤프 출력 
[x]인텔 기계어 형식 정리하기 
[]PLT, GOT 값 찾아가기 (plt에 있는 라이브러리 함수 이름 체킹) 
[x]static의 경우 찾기가 조금 어렵네 인덱스 번호가 아니라 함수의 이름만 적어서 찾을 수 있도록 해야겠다. (아니면 FUNC만 출력할 수 있도록할까)
[x]헥스 덤프를 통해 나온 값 기계어 형식에 맞춰서 디스어셈하기 
[]어셈블리로 정의한 함수는 왜 readelf -s binnary 했을 때 보이지 않는가 (size가) 
[]data flow analysis
[]symbolic execution
[]concolic execution 
[]함수 디스어셈블경우 => 해당 함수 위치에서 함수의 끝이 어딘지 판단하는 알고리즘이 필요 (x86, x64상의 함수 에필로그 바이너리 코드 형태인지 아닌지) 
[x]디버거의 기본 동작(메모리 조회, 레지스터 조회, 메모리 쓰기 => ptrace를 통해) => ptrace 원리 공부하기 
[]IR(중간언어)에 대해 자세히 공부하기 
[]BinaryAnalysis_Documents-2(1) 안에 PDF 공부하기 
[]UI작업은 GTK+로 하기 or 동아리원중에 찾기
[x]PTRACE_SYSCALL, PTRACE_SINGLESTEP 정확히 이해하기 
[x]ptrace => break point 잡기 
[]ptrace memory inject 구현하기 
[x]intel architecture manual 2권 2장 다 보기 
[x]intel architecture manual 3권 3장( protected-Mode memory management), 4장(Paging) 다보기 
[x]stripped 파일의 경우 즉, symtab를 찾을 수 없는 경우 그냥 다 분석한다.
[]함수의 에필로그, 프롤로그 분석해서 sub_<address>의 구조 
[]각 종 루틴들 그래프 (GUI)화 시키기 (인자 instruction list, jump opcode, jump address)
[]자료구조
[]소프트웨어 마에스트로 지원하기 (자기소개서 2월 18일 안까지 작성하기) 
[]리눅스 바이너리 메모리보호 기법 간파하기( ex. . . PIE format) 
[]Linux kernel 분석 

=> 바이너리를 분석을 어떻게 할것인가, 실행흐름은 어떻게 판단할 것인가. 



아래는 그냥 공부하다가 새로운거 추가한건데 글거올때 딸려옴. 
Addressing Modes
Here are some examples of the allowed addressing modes:
    xor    cx, [59507]     ; Direct mode (XOR CX with word at DS:E873)
    push    word [bx]     ; Register-indirect mode (Push word at DS:BX onto stack)
    mov    ax, [bp-4]     ; Base mode (Move word at SS:(BP-4) into AX)
    sub    [si+2], bx     ; Indexed mode (Subtract BX from word at DS:(SI+2))
    not    byte [bp+di]     ; Base-indexed mode (Invert bits of byte at SS:(BP+DI))    
    add    [bx+si+2], dx     ; Base-indexed mode with dispacement (Add DX to word at DS:(BX+SI+2))
The five addressing modes available are outlined more precisely for your reference below:
  Direct Mode: [constant]
    constant: 16-bit unsigned value

  Register-Indirect Mode: [register]
    register: bx, si, or di
    Note: bp technically isn't allowed. If used, assembler will generate [bp+0] instead.
  
  Base Mode: [constant + baseReg]
    constant: 8-bit or 16-bit signed value
    baseReg: bp or bx
  
  Indexed Mode: [constant + indexReg]
    constant: 8-bit or 16-bit signed value
    indexReg: si or di

  Base-Indexed Mode: [baseReg + indexReg]
    baseReg: bp or bx
    indexReg: si or di

  Base-Indexed Mode with Displacement: [constant + baseReg + indexReg]
    constant: 8-bit or 16-bit signed value
    baseReg: bp or bx
    indexReg: si or di


void putdata(pid_t child, long addr, char *str, int len)
{   char *laddr;
    int i, j;
    union u {
            long val;
            char chars[long_size];
    }data;
    
    i = 0;
    j = len / long_size;
    laddr = str;
    while(i < j) {
        memcpy(data.chars, laddr, long_size);
        ptrace(PTRACE_POKEDATA, child, addr + i * 4, data.val);
        ++i;
        laddr += long_size;
    }
    
    j = len % long_size;
    if(j != 0) {
        memcpy(data.chars, laddr, j);
        ptrace(PTRACE_POKEDATA, child, addr + i * 4, data.val);
    }
}



Comments