Assembly

x86 assembly 디버깅 및 개발환경 구축

jdaemanv2 2021. 12. 21. 21:40

[1. 개발환경]

어셈블러 설치

$ sudo apt install nasm

 

 

[2. 디버깅: pwndbg 설치]

리눅스 디버거 gdb 를 좀 더 사용하기 쉽게 한 플러그인이다.

x86 레지스터 값을 어셈블리 코드 단위로 실행하면서 볼 수 있어서 매우 유용하다.

pwndbg 는 아래 명령어를 통해 설치할 수 있다.

$ git clone https://github.com/pwndbg/pwndbg
$ cd pwndbg
$ ./setup.sh

 

 

[3. pwndbg 사용]

gdb 처럼 사용한다.

$ gdb "a.out"
pwndbg> break _start
pwndbg> run
pwndbg> ni

특정 label 에 breakpoint 설정 후, 디버깅을 시작하며,

ni(=next instruction) 을 이용하여 한줄씩 명령어를 실행 할 수 있다.

 

 

[4. pwndbg 삭제]

$vim ~/.gdbinit

home directory 밑에 gdbinit 이라는 숨김파일을 edit 하는데

해당 파일내 모든 코드를 주석처리(#) 하면 된다.

 

pwndbg 설치 시 setup.sh 을 살펴보면 다음과 같은 명령어가 존재한다.

 

 

[5. C code to Assembly code]

gcc 에서 -S 옵션을 활용하여 C 소스코드를 어셈블리 코드로 번역할 수 있다.

기본적으로 AT&T 문법으로 작성 된 어셈블리 코드가 생성되므로,

intel 문법으로 바꾸기 위해선 -masm=intel 옵션을 gcc 실행 시 전달해야 한다.

그리고 -o 옵션으로 별도로 산출물의 파일명을 명시하지 않으면,

입력으로 준 소스코드의 prefix 를 활용하여 .s 파일이 만들어 진다.

// test.c
int main()
{
        int a = 5;
        int b = 3;
        int c = a+b;

        return c;
}

$ gcc -S -masm=intel test.c

$ cat test.s

        .file   "test.c"
        .intel_syntax noprefix
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        endbr64
        push    rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        mov     rbp, rsp
        .cfi_def_cfa_register 6
        mov     DWORD PTR -12[rbp], 5
        mov     DWORD PTR -8[rbp], 3
        mov     edx, DWORD PTR -12[rbp]
        mov     eax, DWORD PTR -8[rbp]
        add     eax, edx
        mov     DWORD PTR -4[rbp], eax
        mov     eax, DWORD PTR -4[rbp]
        pop     rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"
        .section        .note.GNU-stack,"",@progbits
        .section        .note.gnu.property,"a"
        .align 8
        .long    1f - 0f
        .long    4f - 1f
        .long    5
0:
        .string  "GNU"
1:
        .align 8
        .long    0xc0000002
        .long    3f - 2f
2:
        .long    0x3
3:
        .align 8
4: