dreamhack[드림핵]/Reverse Engineering(6)
-
6일차 (x64dbg 사용법)
x64dbg 사용법 x64dbg x64dbg는 원도우 디버거이다. 32비트와 64비트를 모두 지원하며 소스코드가 공개되어있다. x64dbg의 실행 x64dbg는 https://x64dbg.com/에서 다운받을 수 있다. 다운받은 폴더의 압축을 푼 후 release폴더에 들어가 몇 비트냐에 따라 32비트 64비트 중 선택하면 된다. 하지만 드림핵 강의에서는 대부분 64비트 프로그램에 대한 리버싱을 다루기에 대부분의 상황에서 64비트를 선택하여 진행하면 된다. x64dbg의 시작화면 x64dbg에 분석할 실행파일을 드래그 앤 드랍하면 아래쪽과 비슷한 화면을 볼 수 있다. x64dbg의 사용법 - 기본적인 UI x64dbg의 기능 1. 분석할 프로그램을 연다. 2. 프로그램을 재시작한다. 3. 프로그램을 완전..
2021.11.26 -
5일차 (Hello World 어셈블리 분석)
Hello World Hello World - 1 프로그래밍 언어를 배울 때 먼저 Hello World를 출력하는걸 다 해봤을 거다 이번엔 C언어로 짜인 코드가 어떻게 어셈블리 코드로 바뀌었는지 공부할거다. Hello World - 2 하단에 보이는 어셈블리 코드는 x64dbg를 통해 main함수 일부분을 가져온 것 1.주소 해당 어셈블리 코드의 시작 주소가 여기 표시됨 2.기계코드 사람이 읽을 수 있는 어셈블리 코드의 전 단계인 기계어가 여기에 표시됨 :앞에 있는 값은 prefix이고 띄어쓰기 다음에 있는 부분은 어셈블리 코드의 2번째 인자 부분 3.어셈블리어 비교적 사람이 읽기 쉬운 형태인 어셈블리 코드가 여기에 표시됨 3번째를 보면 &puts라고 표시해주는걸 알 수 있다. 4.코멘트 2번째 줄을 보..
2021.11.25 -
4일차
Instructions Instructions(1/5) - Data Movement 값을 레지스터나 메모리에 옮기는 명령어들 mov mov는 src에 들어있는 값을 dst로 옮김 lea lea는 Load Effective Address로, dst에 주소를 저장 Instructions(2/5) - Arithmetic Operations 산술 연산과 관련된 명령어들 따라서 FLAGS 레지스터의 CF, OF, ZF 등과 관련이 있다. Unary Instuctions Instuctions 설명 inc, dec dst의 값을 1 증가시키거나 감소시킴 neg dst에 들어있는 값의 부호를 바꿈(2의 보수) not dst에 들어있는 값의 비트를 반전 Binary Instuctions Instuctions 설명 add..
2021.11.24 -
3일차
Instruction Format Instuction Format 명령어를 구성하는 두 개의 큰 요소인 명령 코드(Opcode)와 피연산자(Operand)에 대해 공부하자 Opcode (Operation Code) 명령 코드(Opcode, Operation Code)는 명령어에서 어떤 동작을 할지 나타내는 부분 산술 연산, 자료 제어 등 다양한 명령어 코드가 있다. Opcode(Operation Code) 기계 코드(Machine Code) 또는 명령 코드(Opcode) 바이너리로 구성되어 있으며 CPU가 실제로 수행할 작업을 숫자로 나타냄 어셈블리 코드(Assembly Code) - 숫자로 이뤄져 있는 명령어 코드는 사람이 구분하고 이해하기 쉽지 않다. 그래서 이것이 어떤 의미를 갖는지 알아보기 쉽도록..
2021.11.23 -
2일차
Introduction 디스어셈블 과정을 통해 얻은 어셈블리 코드를 이해하기 위해 어셈블리 코드 공부 기계 코드가 실제로 동작할 CPU에 따라 기계 코드가 바뀌는데 앞서 배운 것처럼 어셈블리 코드는 기계 코드와 1:1 대응이므로 CPU의 종류에 의해서 어셈블리 코드도 달라진다. 그럼 가장 널리 쓰이는 IIntel 구조의 64bit 버전 명령어 집합(64-bit version IA32 Intruction Set, 이하 x64 )에서 쓰이는 x64 명령어 집합(x86-64 Instruction Set)에 대해 알아보자 들어가기에 앞서 InStruction Cycle CPU는 기본적으로 다음 실행할 명령어를 읽어옴(Fetch) -> 읽어온 명령어를 해석(Decode) -> -> 해석한 결과를 실행(Execut..
2021.11.22 -
1일차
Reverse Engineering 리버스 엔지니어링(Reverse Engineering)은 이미 만들어진 시스템이나 장치를 해체나 분석을 거쳐 다양한 정보를 알아내는 과정(완성품 없이 구조와 동작 과정을 알아내는 과정) [리버스 엔지니어링 = 역공학 = 리버싱]같은 뜻 리버싱은 위와 같은 일을 하기 때문에 산업의 전 분야에 걸쳐 적용될 수 있다. 허나 dreamhack에서는 소프트웨어를 대상으로만 이루어진다. 공부 갈래 소스 코드가 없는 상태에서 컴파일된 대상 소프트웨어의 구조를 여러가지 방법으로 분석, 메모리 덤프를 비롯한 바이너리 분석 결과를 토대로 동작 원리와 내부 구조 파악, 이를 바탕으로 원래의 소스가 어떻게 작성된 것인지에 대해 공부 리버싱이 필요할 때 : 대상의 동작원리와 구조를 알고싶을 ..
2021.11.21