Reverse Engineering DAY_005 레지스터, OllyDBG 레지스터 , Register, 범용 레지스터, 인덱스 레지스터, 포인터 레지스터, 어셈블리어 명령어, OllyDBG 레지스터 이해, OllyDBG 실습

2024. 2. 24. 16:37Information Security 정보보안/Reverse Engineering 리버스 엔지니어링

728x90

배울내용: 

레지스터

OllyDBG  레지스터 

Register 

범용 레지스터 

인덱스 레지스터

포인터 레지스터 

어셈블리어 명령어

OllyDBG 레지스터 이해 

OllyDBG 실습 

Reversing Engineering 

리버싱 엔지니어링 기초

 

 

 

배울내용 : 레지스터(Register) 

 

 

 

 

레지스터(Register)는  CPU(Central Proceessing Unit)요청을 처리하는데 필요한 데이터의 임시저장 공간이다.

 레지스터는 비싸지만 CPU에 직접 연결되어 있어서 연산 속도가 다른 RAM, HDD, SDD 보다 빠르다. 그리고 CPU 자체적으로 데이터를 저장할 수 없어서 레지스터를 이용해 연산처리를 도와주며 컴퓨터 장치들을 제어한다.

 

 

레지스터(EAX, ECX ...) 와 플레그 (C,P,A,Z...)

 

범용 레지스터(General-Purpose Register)

컴퓨터의 중앙 처리 장치(CPU) 내에 있는 레지스터 중에서 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등의 여러 가지 목적으로 사용될 수 있는 레지스터다.

 

인덱스 레지스터(Index Register)

인덱스 레지스터(Index Register)는 주로 어레이(array)나 테이블(table)과 같은 데이터 구조에서 특정 원소에 접근할 때 사용되거나 복사나 비교를 할 경우 주소를 저장하는 레지스터이다.

 

포인터(pointer Register)

포인터는 메모리 내의 특정 위치를 가리키는 변수로 사용되며, 포인터 레지스터는 이러한 포인터 변수를 저장하고 조작하는 데 사용된다.

 

 

 

 

 

 

이렇게 EAX 를 OllyDBG에서 변경도가능한데

 

 

EAX 를 더블클릭후 AL 을 11 로하면 EAX가 11로 바뀐다 

그외에 EAX로도 변경 할 수 있다 

 

 

 

 

 

어셈블리어 명령어 

 

 

 

 

 

 

그럼이제 한번 실제로 실행되는 파일을 만들어서 실행해보고 분석해보는걸 해보자

먼저 Kali에서 vi test.c 로 아래처럼 만들어준다

 

 

 

 

그리고 gcc -o test test.c 로 컴파일 시킨다 

 

 

 

 

 

그러고 실행하면 아까 print 를 Hello SARIMUS 하는게 보인다

 

 

 

 

 

정상적으로 실행이 되면 

gdc test 를 해본다 

 

"gdc"는 GNU D Compiler의 준말로, D 프로그래밍 언어를 위한 GNU 프로젝트의 공식 컴파일러이다 . D 언어는 C와 C++과 유사한 문법을 가지고 있지만, 더 많은 기능과 안전성을 제공하는 프로그래밍 언어다.

 

 

 

여기서 disassemble main 명령어를 입력 해본다 

 

 

그리고 setdisassambly-flavor intel 로 문법을 바꿔주고

show disassembly-flavor 로 어떤 문법인지 알수있다 (아까전 att 에서 -> intel로 ) 

 

 

그러면 좀더 보기좋게 아래처럼 나온다 

 

 

우리가 그동안 배울걸 볼수있다 

vi test 를 다시보면 

 

이렇게 코드를 짠게  저렇게 어셈블리어로 표현 된것이다

 

 

 

이걸하나하나 이해하기 쉽게 보면 아래와 같다. 

 

 

0x0000000000001139 <+0>:     push   rbp

rbp 는 basepoint 로 Push 하는걸로 되어있는데 이것은 Stack에 Push를 한다 

 

0x000000000000113a <+1>:     mov    rbp,rsp

rsp 는 stack pointer 로 어떤데이터가 주소값을 갖게 되면 어떤 위치인지 최상의 위치를 알려주는것이다 (아무것도 없기떄문에 rbp 하고 rsp 가 같게됨)

 

0x000000000000113d <+4>:     lea    rax,[rip+0xec0]        # 0x2004

[rip + 0xec0] 이것의 위치를 있는 것을 rax 에 leave 시키라고한다 (주소값을 move 시키는 것) , (move는 일반 값을 옮김)

 

0x0000000000001144 <+11>:    mov    rdi,rax

rax 값을 다시 rdi 에 옮긴다 


0x0000000000001147 <+14>:    mov    eax,0x0

rax 를 rdi 로 초기화(move) 시킨다 

 

0x000000000000114c <+19>:    call   0x1030 <printf@plt>

printf를 하게 되면 "Hello SARIMUS" 값인 [rip+0xec0] 을 불러온다

 

0x0000000000001151 <+24>:    mov    eax,0x0

이제 다썻으니 다시 0 으로 초기화 시켜준다

 

0x0000000000001156 <+29>:    pop    rbp

pop해서 꺼내면 stack은 비게 된다 

 

0x0000000000001157 <+30>:    ret

리턴값없음 

 

 

 

 

 

 

 

이제다시 OllyDBG 로 돌아와서 

 

Code Window 에서 어셈블리어 코드를 이렇게 변경한뒤에 하나 진행하는 F8 로 실행해본다 

 

MOV EAX ,1 

MOV EBX , EAX 

ADD EAX , 4 

ADD EBX , EBX

ADD EBX , EAX 

진행사항은 아래와 같다 

그리고 이게 바뀌는걸 레지스터 창에서 확인이 가능한다

 

 

 

 

아직 code Window 나 레지스터 창이 어딘지 헷갈리면 아래의 링크를 다시가서 보도록하자 

 

https://sarimus.tistory.com/84

 

Reverse Engineering DAY_003 리버싱 위해 알아야할 것, 리버싱 기초, 리버싱 분석 방법, 정적파일 동적

배울내용: 리버싱 위해 알아야할 것 리버싱 기초 리버싱 분석 방법 정적파일 동적파일 OllyDBG 란? 디버거 도구 디버거란? OllyDBG 화면 OllyDBG 단축키 PE 파일 Reversing Engineering 리버싱 엔지니어링 기초

sarimus.tistory.com

 

 

 

 

 

 

만약 이번엔 위에처럼 되어있을떄 EAX 의 값은 얼마가 될까? 

 

 

 

 

 

 

아래에는 풀이가 되어있다 그전에 한번 풀어보도록 하길바란다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90