웬디의 기묘한 이야기

글 작성자: WENDYS
반응형

디버깅을 위해서는 항상 소스코드 레벨에서 할 수 없기때문에 어셈블리언어를 읽을 수 있어야 합니다.

디버깅을 위한 어셈블리는 언어를 깊이 많이 알지 못하더라도 디버깅을 할 수 있지만,

어셈블리를 모르면 디버깅하는데 많은 어려움이 있으므로 이번에 몇가지 소개시켜드리겠습니다.

실제로 디버깅시 사용되는 어셈블리어는 많이 없으며, 자주 나오는 패턴에는 소스코드를 보듯 익숙해질 필요가 있습니다.

ASSEMBLY

가장 대표적인 명령어를 예로 들자면 아래와 같습니다.

mov (값을 대입)

add (더하기)

sub (빼기)

inc (1 더하기)

dec (1 빼기)

jmp (go to)

call (함수 호출)

cmp (두 값을 비교)


각각 C언어와 비교하면서 어떻게 코드가 생성되는지 보겠습니다.


해당 코드는 visual studio 2015 에서 테스트 하였습니다.

mov

    int number = 0;

0108383E  mov         dword ptr [number],0

  

    char flag = 1;

01083845  mov         byte ptr [flag],1  


    char name[] = "hacker_n0te";

01083849  mov         eax,dword ptr [string "hacker_n0te" (01086CB8h)]  

0108384E  mov         dword ptr [name],eax


add

    int number1 = 1;

003D3863  mov         dword ptr [number1],1  

    int number2 = 2;

003D386A  mov         dword ptr [number2],2  

    int number3 = 3;

003D3871  mov         dword ptr [number3],3  


    number = number1 + number2 + number3;

003D3878  mov         eax,dword ptr [number1]  

003D387B  add         eax,dword ptr [number2]  

003D387E  add         eax,dword ptr [number3]  

003D3881  mov         dword ptr [number],eax


sub

    int number1 = 1;

00113863  mov         dword ptr [number1],1  

    int number2 = 2;

0011386A  mov         dword ptr [number2],2  

    int number3 = 3;

00113871  mov         dword ptr [number3],3  


    number = number3 - number2 - number1;

00113878  mov         eax,dword ptr [number3]  

0011387B  sub         eax,dword ptr [number2]  

0011387E  sub         eax,dword ptr [number1]  

00113881  mov         dword ptr [number],eax


jmp

    for (int i = 0; i < 10; i++) {

00AE4AAC  mov         dword ptr [ebp-70h],0  

00AE4AB3  jmp         main+8Eh (0AE4ABEh) 

00AE4AB5  mov         eax,dword ptr [ebp-70h]  // (main+85h)

00AE4AB8  add         eax,1  

00AE4ABB  mov         dword ptr [ebp-70h],eax  

00AE4ABE  cmp         dword ptr [ebp-70h],0Ah  // (main+8Eh)

00AE4AC2  jge         main+0A1h (0AE4AD1h)  

        if (true) {

00AE4AC4  mov         eax,1  

00AE4AC9  test        eax,eax  

00AE4ACB  je          main+9Fh (0AE4ACFh)  

            continue;

00AE4ACD  jmp         main+85h (0AE4AB5h)  

        }

    }

... // (main+0A1h)


call

    printf(name);

00814ADD  lea         eax,[name]  

00814AE0  push        eax  

00814AE1  call        _printf (0811352h)  

00814AE6  add         esp,4


cmp


    if (number1 == number2) {

00E34A9E  mov         eax,dword ptr [number1]  

00E34AA1  cmp         eax,dword ptr [number2]  


    if (number1 == number2) {

00E34AA4  jne         main+7Dh (0E34AADh)  

        number3 = 10;

00E34AA6  mov         dword ptr [number3],0Ah  

    }




반응형