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: