2024. 2. 22. 21:44ㆍInformation Security 정보보안/Reverse Engineering 리버스 엔지니어링
배울내용:
리버싱 위해 알아야할 것
리버싱 기초
리버싱 분석 방법
정적파일 동적파일
OllyDBG 란?
디버거 도구
디버거란?
OllyDBG 화면
OllyDBG 단축키
PE 파일
Reversing Engineering
리버싱 엔지니어링 기초
지난 학습 내용
: 중앙처리장치 구조 및 작동원리 , 레지스터 구조, 메모리 구조 및 작동원리 , 메모리 프로세싱 구조
https://sarimus.tistory.com/82
지난시간에 프로그래밍 언어로 코드가 어떻게 메모리에서 실행되는지 배웠다
이번시간에는 어셈블리어와 OllyDBG 에 대해서 학습할것이다
Source 에서 코드를 쓰고 그코드가 기계어로 바뀌면
Hex 값으로 바뀌고 (메모리에저장) 그리고 이 HEX 값을
Assembly 로 HEX 코드를 이용한다
그리고 이 Assembly 가 HEX 코드로 리버싱을 한다
그러면 리버싱을 위해서 알아야할것은 무엇이 있을까?
리버싱을 위해서는 고급언어(High Level Language) 보다는
저급언어를 배워야할 필요가있다
기계어는 CPU가 직접 실행할 수 있는 0과 1로 이루어진 이진 코드다.
이 코드는 바이너리 형태로 저장되며, CPU가 직접 해석하고 실행할 수 있다. 반면에, 어셈블리 언어는 사람이 이해하기 쉽도록 설계된 텍스트 기반의 저급 프로그래밍 언어이며, 기계어와 일대일로 매핑된다.
어셈블리 언어는 사람이 이해하기 쉽도록 기계어의 각 명령어를 단순한 단어나 약어로 대체하여 작성된다.
예를 들어, 기계어 명령어가 10110000과 같이 이진수로 표현될 수 있다면,
어셈블리어에서는 해당 명령어에 대응하는 니모닉(문자 기호)을 사용하여 표현된다.
이것은 인간이 이해하기 쉬운 형태이며, 특정 CPU 아키텍처의 기계어에 직접 대응된다.
기계어는 비트로 (0,1의 모음) 표현 되고 기호화해서 Assembly 어로 만든다.
1 대 1 대응을 시켜 코드화 한 모습이다
(101010110 <-> ADD EAX , 7 (EAX 에있는 레지스트리에 7을더해서 EAX 위치에 저장)) < 그저 EAX 에 7 더하는게 아님 ! >
조금더 자세히보면 아래와 같다
Opcode 와 OPerand1, Operand2 가있는데 명령어로 Operand1에다가 Operand2를 더하라는 명령을해서 더해주고 저장하는것이다. (Intel 문법) 이떄 피연산자가 2개가있지만 1개만 있는경우도 있다
그러면 이렇게 OllyDBG 로 보게된다면 엄청많이 되있는데 어떻게 리버싱해서 분석할수있을까?
분석방법은 크게 2가지가 있다
정적분석은 실행하지않고 확인하는것이고
동적분석은 직접 실행시켜서 확인하는 것이다
악성코드 분석할때는 주로 동적분석을 많이한다, 그이유는 악성코드가 실행했을때 어떤행위를 하는지 알아야하기 때문이다. 그러나 리버싱은 주로 정적분석이 더 많다
OllyDBG 란?
OllyDBG 실행모습
C 언어로 프로그래밍 한걸 가지고 If 문 switch 문 , for 문을 분석해내게 된다 그리고 이를 통해 어떤것인지 알아낼수가 있다
디버거를 쓰면 리버스 엔지니어링은 물론 좀더가면 악성코드 분석 및 포렌식 분야에도 다양하게 쓰인다
그러면 OllyDBG 화면을 설명하면 아래와 같다
OllyDBG 화면
CODE Window 를 더 자세히보면
- 물리적 주소 (Physical Address): 코드 창에서 물리적 주소는 프로그램의 메모리에 대한 실제 물리적 위치를 나타낸다. 이것은 주로 메모리 내의 특정 위치에 대한 어셈블리 코드를 나타낸다 . 예를 들어, 00401000과 같은 형식으로 표시될 수 있다.
- 기계어 코드 (Machine Code): 코드 창에서 기계어 코드는 해당 프로그램의 실제 이진 명령어를 나타낸다. 보통 이진 형식으로 표시되며, 메모리 주소에 대응하는 기계어 코드가 표시된다. 이 코드는 CPU가 직접 실행할 수 있는 명령어입니다. 예를 들어, 8B 45 FC와 같은 형태일 수 있다.
- 어셈블리어 코드 (Assembly Code): 코드 창에서 어셈블리어 코드는 기계어 코드를 사람이 이해하기 쉬운 형태로 변환한 것이다. 보통 명령어와 해당 명령어의 피연산자들이 표시된다. 이것은 프로그래머가 프로그램의 동작을 이해하고 수정하기 쉽도록 하는 데 사용된다. 예를 들어, MOV EAX, [EBP-4]와 같은 형태일 수 있다.
- 아스키 코드 (ASCII Code): 코드 창에서 아스키 코드는 텍스트 데이터를 나타내는 데 사용된다. 이는 문자열 또는 텍스트 기반 데이터를 표시하고 수정하는 데 사용된다. 예를 들어, "Hello, World!"와 같은 문자열이 아스키 코드로 표시될 수 있다
간단하게 테이블로 나타내보면 아래와 같다
Register Window
레지스터 창(Register Window)은 디버깅 도구에서 프로세서 레지스터의 현재 상태를 보여주는 창이다. 프로그램 실행 중에 CPU가 어떻게 동작하는지 이해하고 프로그램의 상태를 추적하는 데 유용하다.
Hash Dump
주기억장치 메모리에 저장되어있는 ASCII 이며
해시 덤프(Hash Dump)는 일반적으로 시스템에서 사용자 계정의 비밀번호를 저장하는 방식 중 하나이다.
Stack Window
스택은 프로그램이 시작되서 끝날떄까지 간다는 특징이있다 .
그리고 스택 창(Stack Window)은 디버깅 도구에서 프로그램의 스택 메모리 상태를 보여주는 창이다.
또한 프로그램이 실행될 때, 스택은 함수 호출 및 지역 변수와 같은 데이터를 저장하는 데 사용된다.
종합해서 보면 아래와 같다
앞으로 OllyDBG 에서를 계속 쓰면 단축키도 존재한다
OllyDBG 단축키
이중에서 실제로는 가장 많이쓰일법한것은 F2, F8 , F9 . ctrl +F2 , Ctrl+ G 를 가장 많이 쓰게 될것이다
문자열 검색
우클릭 -> search for -> all referenced text strings
모든 CALL 검색
우클릭 - > search for -> All intermodular calls
그럼 아까 2가지 파일을 리버싱한다고했다 ( 정적파일과 동적파일 )
그러나 앞으로 대부분 리버싱 분석을 하는건 실행파일이다. 그 구조를 아래와 같이 부른다
(실행 파일은 주로 정적 파일)
window 에서는 PE(Portable Executable) 라고 하고 Linux 에서는 ELF (Executable Linked Format) 이다
PE 구조
95 % 이상 EXE 파일이고 DLL 은 필요하면 꺼내오는 것이라고 설명했었다
그외에는 크게 중요하지않다
IAT는 Import Address Table 으로 import 되있을때 호출된 함수들이 어떤 주소값이 저장되어있는 표이다
언패킹은 패킹과 언패킹으로 쓰이는데 쉽게 설명하면 패킹은 압축실행파일이고 ( 패킹은 암호화나 압축의 개념이 있다 , 그런데 실행하게 되면 압축이 해제되면서 메모리에 올라오고 실행이 되어버린다 또한 패킹되어있으면 축약되어있기 때문에 분석이 어려움) 언패킹은 이런 패킹된걸 언패킹 시켜주는것이다.)
분석도구
PEview 로 파일구조(PE파일의 구조)를 보고
PEiD 가 패킹이 되어있는지 안되어있는지 보고 , 암호화가 되어있는지 본다
그외에도 exeinfo 나 pestudio 등 다양한 프로그램(도구) 를 다운받아서 디버깅 및 정적 분석을 할때 사용한다
다음시간에 좀더 PE 구조에대해 세세하게 알아볼것이다