ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [02-06 공부정리]
    공부정리 2018. 2. 6. 01:41

    2018-02-05 오늘 하루 공부한 것을 정리한다.


    오늘은

    리버싱 핵심원리(나뭇잎 책)을 보면서 공부를 진행했다.

    내 분야를 탐색하는데 시간이 오래걸렸다.

    시스템도 재밌고, 네트워크 또한 재밌게 느껴졌다. 웹도 그러했고.


    그러다 리버싱을 한번 경험해봤는데 너무 재밌었다!

    정확히 말하면 포너블 문제를 풀기위해 리버싱을 하는 과정이었는데

    포너블과 리버싱은 숟가락과 젓가락같은 관계라고 생각했기 때문에

    둘 중 리버싱을 좀 더 집중적으로 공부해보기로 마음먹었다.

    앞으로 공부는 [리버싱 핵심원리]로 진행할 것이다.


    오늘은 1장~5장까지 공부했다.

    리버싱이 무엇인지 부터해서 HelloWorld.exe 메인함수 찾기, 디버거 사용법, 바이트오더링, IA-32 레지스터 까지 말이다.


    우선 HelloWorld.exe에서 메인함수를 찾기위해서 [Ollydbg]로 열어보면 딱 위치해있는 주소값이 있다.

    이 주소값을 EP(Entry Point)라고 한다.


    [HelloWolrd.exe EP]


    근데 보면 바로 메인함수부터 시작하는게 아닌 뭔지 모르겠는 함수를 먼저 호출한다.

    호출하는 함수명이 [__security_init_cookie] 인 것을 보면 뭔가 프로그램 보안을 위해 호출된 것같다.

    저 함수 안을 따라들어가 봤다.

    [HelloWorld.exe __security_init_cookie]


    또 다시 뭔지 모르겠는 코드들이 쭉 있다.

    보면 KERNEL32에서 API함수들을 메모리에 로드하는 코드인 것 같다.

    그래도 내가 찾는 메인함수는 아닌 것 같다.


    이렇게 사용자가 직접 선언하지 않고, 컴파일러가 프로그램 실행을 위해 추가한 코드를

    [Stub Code]라고 한다.

    Stub Code는 컴파일러마다 각각의 시그니쳐가 존재한다.

    다양한 Stub Code들을 접해서 시그니쳐들은 눈에 익혀두면 향후에 빠른 분석에 도움이 된다.

    [Hello World CALL main]


    여러개의 Stub Code들이 실행된 후, 내가 찾는 main함수가 보인다.

    인자값인 argv,argc가 스택에 저장이 되고, main함수를 호출되는 것을 확인할 수 있다.


    [Hello World main]


    내가 찾던 main함수에 들어왔다!

    Hello World 문자열을 스택에 저장해서 printf함수에 인자값으로 전달하는 모습을 볼 수 있다.

    printf함수 호출이 끝나면 

    ESP에 4를 더해주고 XOR연산으로 EAX를 0으로 만들어 준다.

    (XOR연산은 A와B가 같으면 0이되는 연산이다)




    [바이트 오더링]

    바이트 오더링이란?

    데이터를 저장하는 방식을 말하는 것이라고 생각하면 된다.

    바이트 오더링에는

    "Big Endian" / "Little Endian" 2가지 방식이 있다.


    BYTE b = 0x12;

    WORD w = 0x1234;

    DWORD dw = 0x12345678;

    char str[ ] = "abcde";

    이러한 데이터들이 메모리에 저장이 될때를 표를 통해서 알아보자


     Type[size]

    Name

    Big Endian

     Little Endian

     BYTE[1]

    b

     [12]

    [12] 

     WORD[2]

     [12][34]

    [34][12] 

     DWORD[4]

     dw

     [12][34][56][78]

    [78][56][34][12] 

     char[6]

     str

     [61][62][63][64][65][00]

     [61][62][63][64][65][00]


    보면 Big Endian은 우리가 보기 편하게 데이터가 저장되는 반면

    Little Endian은 Byte단위로 역순으로 저장된다.

    (문자열일때는 관계없이 연속적으로 저장이 된다.)


    이는 컴퓨터가 산술연산과 데이터의 확장/축소를 할 때, 역순으로 저장되는 것이 더 효율적이기 때문에 그렇다.

    예를 들어, 가산기가 자리올림 계산을 할때

    Big Endian이라면 역방향으로 진행을 해야하는 번거로움이 있다.

    그에반해 Little Endian은 데이터가 역순으로 저장돼있으니 정방향으로 진행하면 된다.

    이러한 부분에서 Little Endian이 구조설계면에서 효율적인 모습을 보인다.




    [IA-32 레지스터]


    IA-32에서 지원하는 기능이 많은 만큼 레지스터의 수도 정말 많이 존재한다.

    나는 아직 입문단계이기때문에 필수적인 레지스터들만 우선 공부했다.


    * General Purpose Register(32Bit-8개)

    ㄴ EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP


    * Segment Register(16Bit-6개)

    ㄴ CS,DS,SS,ES,FS,GS


    * Program Status Control Register(32Bit-1개)

    ㄴ EFLAGS


    *Instruction Register(32Bit-1개)

    ㄴ EIP


    [General Purpose Register]

    - EAX,EBX,ECX,EDX - ADD/SUB/XOR/OR 등 연산할 때 사용

    (ECX는 카운트할 때도 사용한다.)

    - ESI,EDI - LODS,STOS,REP,MOVS 등 메모리 복사할 때 사용

    - ESP,EBP - StackFrame을 만들때 사용

    (EBP는 스택에 제일 바닥(높은주소)를 가르키고

    ESP는 스택에 제일 위쪽(낮은주소)를 가르키고 있다.)


    StackFrame이란?

    - 함수가 호출되었을 때, EBP가 ESP의 주소를 스택에 저장해 두었다가

    함수가 리턴하기 전에 ESP주소를 넘겨줘서 스택이 깨지지 않도록 유지하는 기법이다.


      

    [Segment Register]

    세그먼트 레지스터 부분은 아직 이해하기 힘들어서 나중에 다시 한번 정리할 생각이다.

    우선 어떤건지만 정리해두겠다.


    CS - Code Segment

    SS - Stack Segment

    DS,ES,FS,GS - Data Segment


    [Program Status Control Register]

    EFLAGS안에 1비트단위로 여러 개의 Flag들이 존재한다.

    지금은 ZF,OF,CF만 정리하도록 하겠다.


    ZF(Zero Flag) - 연산결과가 0이면 1 / 0이 아니면 0으로 세팅된다.

    OF(Overflow Flag) - 부호가 있는 수에서 Overflow가 발생되거나 MSB(최상위 비트)가 변경되면 1로 세팅된다.

    CF(Carry Flag) - 부호가 없는 수에서 Overflow가 발생되면 1로 세팅된다.


    [Instruction Register]

    - EIP : Instruction Pointer

    EIP에 저장되어 있는 주소의 명령어(Instruction)를 처리하고, 그 길이만큼 자동으로 EIP가 증가된다.

    범용 레지스터들과는 다르게 EIP는 사용자가 변경할 수 없게 되어있다.

    EIP를 변경하기 위해서는 JMP,Jcc,RET,CALL 명령어를 사용하거나 예외나 인터럽트를 발생시켜야 한다.

    (EIP레지스터는 BOF공격에서 주로 변조를 시도하는 레지스터이다.)


    오늘의 정리는 여기까지이다.

    내일은 Stack Memory에 대해 공부를 할 계획이다.


    '공부정리' 카테고리의 다른 글

    [02-14 공부정리(FSB 정리)]  (0) 2018.02.15
    [02-11 공부정리(Chaining RTL 정리)]  (0) 2018.02.11
    [02-10 공부정리]  (0) 2018.02.10
    [02-08 공부정리(RTL정리)]  (1) 2018.02.08
    [02-07 공부정리]  (2) 2018.02.07

    댓글

Designed by Tistory.