2024. 2. 24. 16:37ㆍInformation Security 정보보안/Reverse Engineering 리버스 엔지니어링
배울내용:
레지스터
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
만약 이번엔 위에처럼 되어있을떄 EAX 의 값은 얼마가 될까?
아래에는 풀이가 되어있다 그전에 한번 풀어보도록 하길바란다