본문 바로가기
리버싱

리버싱 3

by 윤라경 2024. 8. 13.

[2024.08.12]

 

[레지스터]

 

> CPU가 사용하는 임시 기억 장치

> 특정 작업 수행

 

 

01. 범용 레지스터

> 다양한 목적으로 사용

 

1) AX(Acuumulator Register)

 

> 산술 연산용 누산기로 사용, 입출력 연산에도 사용

> AX: 16비트

> EAX: 32비트

> RAX: 64비트

 

2) BX(Base Register)

 

> 메모리 주소 계산 시 베이스로 주로 사용

> BX: 16비트

> EBX: 32비트

> RBX: 64비트

 

3) CX(Count Register)

 

> 반복 명령어에서 카운터로 주로 사용

> CX: 16비트

> ECX: 32비트

> RCX: 64비트

 

4) DX(Data Register)

 

> 입출력 명령어에 사용 곱셈과 나눗셈 연산에서 추가적인 데이터 레지스터로 사용

> DX: 16비트

> EDX: 32비트

> RDX: 64비트

 

5) SI(Source Index)

 

> 메모리 주소 지정에서 소스 주소로 사용, 문자열 처리 명령에 사용

> SI: 16비트

> ESI: 32비트

> RSI: 64비트

 

6) DI(Destination Index)

 

> 메모리 주소 지정에서 목적지 주소로 사용, 문자열 처리 명령에 사용

> DI: 16비트

> EDI: 32비트

> RDI: 64비트

 

7) BP(Base Pointer)

 

> 스택에서 프레임 포인터로 사용, 함수 호출 시 스택 프레임을 가리킴

> BP: 16비트

> EBX: 32비트

> RBX: 64비트

 

8) SP(Stack Pointer)

 

> 스택의 최상단을 가리키는 레지스터, 함수 호출 시 스택 프레임을 가리킴

> SP: 16비트

> ESX: 32비트

> RSX: 64비트

 

 

02. 세그먼트 레지스터

> 메모리 세그먼트 시작 주소 저장

 

1) CS(Code Segment): 실행 중인 코드가 있는 세그먼트를 가리킴

2) DS(Data Segment): 일반 데이터가 있는 세그먼트를 가리킴

3) SS(Stack Segment): 스택 데이터가 있는 세그먼트를 가리킴

4) ES(Extra Segment): 추가 데이터가 있는 세그먼트를 가리킴

5) FS, GS:  추가 데이터가 있는 세그먼트를 가리킴, 특정 운영체제에서 사용

 

 

03. 인덱스 레지스터(Index Register)

>  배열과 같은 데이터 구조에서 인덱스 계산에 사용

 

1) SI(Source Index): 소스 데이터의 인덱스

2) DI(Destination Index): 목적지 데이터의 인덱스 역할

 

 

04. 플래그 인덱스

> 연산 결과에 대한 상태 정보 저장

 

1) CF(Carry Flag): 마지막 연산에서 올림이 발생했는지 여부

2) ZF(Zero Flag): 연산 결과가 0인지 여부를 나타냄

3) SF(Sign Flag): 연산 결과가 음수인지 여부 나타냄

4) OF(Overflow Flag): 부호 있는 연산에서 오버플로가 발생했는지 여부

5) PF(Parity Falg): 결과 하위 비트에 있는 1의 비트 수가 짝수인지 여부

6) AF(Auxialiary Flag): 하위의 비트에서 올림이 발생했는지 여부

7) BCD(Binary Code Decimal): 연산에 사용

 

 

05. 명령 포인터 레지스터(Instruction Pointor Register)

> 현재 실행 중인 명령어 주소를 가리킴

 

> IP: 16비트

> EIP: 32비트

> RIP: 64비트

 

 

 

 

 

 

4, 6번을 많이 보게 된다

 

 

F2, F8, F9, Ctrl+F2, Alt+B, Ctrl+G를 많이 사용한다

F7에 들어갈 일은 별로 없으나, F8을 많이 사용하게 된다

 

 

 

 

===================================================================

 

[어셈블리어]

 

01. 데이터 전송 명령어

 

1) MOV

 

> mov [레지스터], [상수]

> mov [레지스터], [레지스터값]

> mov [레지스터], [메모리값]

> mov [메모리 주소], [레지스터값]

> mov dword ptr[401000], [상수]

 

 

 

레지스터 값은 다 헥사값이다

 

 

왼쪽에 있는 곳에서 더블 클릭 후 데이터 전송 명령어를 입력한다

 

 

그렇게 되면 해당 값이 입력이 되는데

 

 

마우스 우클릭으로 New origin here을 클릭 후 실행 상태를 만들어 준다

그런 다음 실행할 곳을 선택 후 F8을 눌러 주면 실행된다

 

 

그렇게 되면 eax 값이 10으로 변경된다

 

 

또 이번에도 메모리 주소에 ecx 값을 넣어 mov를 실행한다

 

 

그렇게 되면 ecx 레지스터에 들어 있는 숫자 3이기 때문에 메모리 주소에 그 값을 넣어,

헥사값이 3으로 변경된다

 

 

이번에는 eax 레지스터에 [402008]이라는 메모리 주소를 넣게 되는데

 

 

현재 메모리 주소에 저장된 헥사값이 3이기 때문에 eax의 레지스터는 3으로 변경된다

 

 

마지막으로 [402010]이라는 메모리 주소에 10이라는 숫자를 부여한다

 

 

그렇게 되면 402010 메모리 주소의 헥사값이 10으로 변경되는 것을 확인할 수 있다

 

 

2) ADD

 

> mov eax,1

> mov eax,7

> mov ecx,5

> mov edx,7

> add ecx,edx

 

> add [402000],eax

> add eax,[402000]

 

 

 

Ctrl+F2로 초기의 상태로 만들어 주고 윗줄 첫 번째에서 mov로 eax 값을 1로 지정한다

그런 다음 add로 eax 레지스터에 7을 더한다

 

 

그렇게 되면 eax 값으로 저장되어 있는 1에 7을 더한다는 뜻으로 eax의 레지스터가 8로 변경된다

 

 

mov를 이용하여 ecx 레지스터에 5를 edx 레지스터에 7을 저장한다

 

 

그런 다음 화면과 같이 입력하게 되면

ecx 값과 edx 값을 더하면 ecx에 더한 값이 저장된다

 

 

현재 헥사값으로 출력되어 C가 나오게 된다

 

 

C로 나오게 되는 이유를 계산기로 확인하게 되면 현재 기본값이 12로 되어 있을 때 헥사값이 C가 된다

ecx 레지스터에 10진수 값 5를 저장, edx 레지스터에 10진수 값 7을 저장하였고

ecx 레지스터에 edx 레지스터의 값을 더하게 되면 둘을 더하게 되면 12가 된다

이 부분에서 10진수에서 12는 16진수로 C에 해당되며,

진수 차이로 인해 값이 다르게 표현되지만, 같은 값을 다른 방식으로 표현하게 되는 것이다

 

*값을 계산할 때는 계산기로 확인하면 된다

 

 

이번에는 [402000]의 메모리 주소에 eax 레지스터에 저장되어 있는 값을 더한다 

 

 

현재 eax 레지스터에 8이 저장되어 있었기 때문에 402000의 메모리 주소 헥사값이 8로 변경되었다

 

 

그런 상태에서 [402000]이라는 메모리 주소에 ecx 레지스터 C 값을 더해 주게 되면

 

 

현재 레지스터 값을 메모리 값에 더하여 14라는 헥사값이 나오게 되었다

 

 

원래 메모리 값에 8이 저장되어 있었고, ecx 값은 C였다

8 (10진수 8) + C (10진수 12) = 14 (10진수 20)로 설명할 수 있다

계산기로 확인 시에도 20은 헥사값으로 14가 도출된다

 

 

마지막으로 eax 레지스터 값의 8에 [402000]이라는 메모리 값을 더한다

 

 

결과를 출력했을 때 1C라는 값이 eax 레지스터에 저장된다

08 (16진수 8, 10진수 8) + 14 (16진수 14, 10진수 20) = 1C (16진수 1C, 10진수 28)로 설명할 수 있다

 

 

계산기로 확인 시에도 28이라는 값은 헥사값으로 1C가 나오는 것을 확인할 수 있다

 

 

 

강의 소감

오늘 강의는 말 그대로 어려웠다

본격적으로 Ollydbg를 실행하여 사용하였고, 그 전에는 레지스터의 종류에 대하여 배웠다

Ollydbg를 실행 후 어셈블리어로 데이터 전송 명령어인 mov와 add를 연습했다

난생 처음 배워 보는 프로그램과 낯선 언어 때문인지 처음에는 뜻대로 되지 않았다

강사님께 질문하여 문제 해결 후에야 실행 및 이해까지 할 수 있었다

강의가 끝나고도 혼자 연습할 때 왜 이런 결과값이 저장되는지 이해가 되지 않아

chat gpt를 통하여 맞는 부분과 틀린 부분에 대해 검색하고 이해하는 시간을 가지게 됐다

결론적으로는 오늘 강의분에 대해서는 이해하게 되었지만,

아직 많이 미숙하기 때문에 이러한 연습을 통해 익숙해지는 연습을 해야 될 것 같다

'리버싱' 카테고리의 다른 글

리버싱 6  (0) 2024.08.16
리버싱 5  (0) 2024.08.14
리버싱 4  (0) 2024.08.14
리버싱 2  (0) 2024.08.09
리버싱 1  (0) 2024.08.08