DreamHack 3강!
오늘도 빨리 정리해보자 :)
4강은 x64dbg의 기본적인 사용법을 설명하는 강의이기 때문에, 간단하게 정리만하고 넘어가겠다.

<3강> : puts("hello world!\n"); → x86_64 asm
< Hello world >


- 주소 : 해당 어셈블리 코드의 시작 주소
- 기계 코드 : 사람이 읽을 수 있는 어셈블리 코드의 전 단계인 기계어
: ":" 앞에 있는 값은 prefix이고, 띄어쓰기 다음에 있는 부분은 어셈블리 코드의 2번째 인자 부분임
- 어셈블리어 : 주소값의 경우 x64dbg가 적절한 형태로 바꾸어서 보여주기도 함.
(3번째 줄에서 &puts라고 표시되는 것 확인))
- 코멘트 : x64dbg가 프로그램을 분석하여 알게된 추가적인 정보
(2번째 줄에서 문자열에 대한 정보가 표시되는 것 확인)
< Hello world - 디스어셈블리 결과 살펴보기 >
1. 디스어셈블리 결과 살펴보기 - 1
: sub rsp, 28
- rsp에서 0x28만큼 빼 함수 내부에서 사용할 스택의 용량을 확보하는 명령어
- 일반적으로 함수에서 지역변수로 선언한 값들이 스택에 위치하게 되는데, 이 지역변수들이
저장될 공간을 컴파일러가 미리 계산하여 함수 시작부분에 확보해두는 것
: lea rcx,qword ptr ds:[7FF6ED802220]
- rcx에 "0x7FF6ED802220" 값을 저장
- "0x7FF6ED802220"는 주소값이며, 코멘트 부분을 확인해보면 puts의 천번째 인자인
"hello world!\n" 가 위치한 주소인 것을 알 수 있음
- puts의 첫번째 인자를 rcx에 넣은 이유는 calling convention(함수 호출 규약)이 존재하기 때문
2. Windows의 함수 호출 규약
- windows의 함수 호출 규약은 다음과 같은 순서로 첫 4개의 인자를 받음.
● rcx (ecx, cx, ···)
● rdx (edx, dx, ···)
● r8 (r8d, r8w, ···)
● r9 (r9d,r9w, ···)
- 이후 5번째 인자부터는 스택에 넣게 되며, 함수의 리턴값은 rax (eax, ax, ···)에 저장됨.
3. 디스어셈블리 결과 살펴보기 - 2
: call qword ptr ds:[<&puts>]
- puts를 호출하는 명령어
: xor eax, eax
- eax를 0으로 만들어주는 명령어
- main함수의 리턴값을 0으로 설정해놨기 때문에 함수의 리턴값을 의미하는 eax 레지스터를 0으로 설정
- [move eax, 0]보다 명령어의 길이가 짧고, CPU에서 좀더 빠르게 실행시킴
: add rsp,28
- 함수 시작시 확보해두었던 스택을 정리하는 명렁어
: ret
- 함수의 실행을 마치고 리턴하기 위해 사용하는 명령어
- call 명령어를 통해 스택에 저장된 Return Address로 돌아감
<4강> : x64dbg 사용법
1. x64dbg
: 윈도우 디버거
: 오픈소스이며, 32비트와 64비트를 모두 지원함
: 강력한 디스어셈블 엔진을 가지고 있으며 그래프 뷰, 플러그인 등 리버싱에 있어서 편리한 여러 기능 내장
'Reversing > 개념' 카테고리의 다른 글
[Reversing] Handray (0) | 2022.08.15 |
---|---|
PE 파일 & API & ELF 파일 (0) | 2021.06.25 |
[DreamHack] 5강 : hello-world.exe로 배우는 x64dbg 사용법 (0) | 2021.03.29 |
[DreamHack] 2강 : x64 기초 (0) | 2021.03.28 |
[DreamHack] 1강 : 리버스 엔지니어링이란 (0) | 2021.03.27 |