활용 강의: 리버싱 이 정도는 알아야지 - 섹션 0
1. 실행파일 동작 확인
'sample01'파일 실행 시에 경고음과 함께 "Hi, Have a nice day!"라는 문자열을 가진 알림창이 뜨는 것을 확인했다.
2. 코드분석_level.1 | 흐름 파악하기
Sample 01.exe를 OllyDBG에 올리면 아래 사진과 같이 코드가 보인다.
이때, 00401030 주소는 StartUp 코드가 시작되는 주소며, StartUP 코드는 컴파일러가 프로그램을만들 때 집어넣는 코드다. StartUp 코드는 main() 함수 앞 단에 위치하므로 main() 함수를 바로 찾아가야 한다.
*main() 함수 찾기
먼저, 단축키 F8을 눌러 코드를 한 줄씩 실행한다.
004010DF 주소에서 비프음이 들리고 “Hi, Have a nice day!” 메시지가 뜨는 것을 확인할 수 있다. 이를 통해 004010D2 ~ 004010DF 주소 사이에서 main() 함수를 호출한다는 것을 유추할 수 있다.
단축키 Ctrl+F2를 눌러 코드를 재시작한다.
비프음과 “Hi, Have a nice day!” 메시지가 출력됐던 004010DF 주소에 단축키 F2를 눌러 BreakPoint를 지정한다.
그 뒤 단축키 F9를 눌러 실행한 다음 단축키 F7을 눌러 004010DF 주소 안으로 들어간다.
Beep() 함수와 MessageBoxA() 함수의 호출 코드를 확인할 수 있다.
이때, Beep() 함수는 비프음을 출력하는 함수이고 MessageBoxA() 함수는 메시지 박스를 출력해주는 API이다.
즉, 004010DF 주소에 main() 함수가 존재한다는 것을 확인할 수 있다.
3. 코드분석_level.2 | API 호출 분석
- API 호출
메모리 맵을 보면 수많은 파일 데이터들이 로드되어 있다. 이를 DLL(동적 라이브러리)라고 한다. Windows 운영체제에서는 EXE 파일의 편의를 위해 DLL이라는 비서를 제공한다. EXE 파일이 모든 동작을 수행할 필요 없이 DLL에게 시키면 특정 행위가 발생하는 것이다. 이렇게 EXE가 DLL에게 행위를 요청하는 동작을 API 호출이라고 한다.
Win 32 API 호출 -> 비프음과 메시지 박스 출력 같은 이벤트 발생
-API는 윈도우에서 쓸 수 있는 함수
Win 32 API는 그 수가 많고, 개개의 API가 가지는 값이 다양하다 -> MSDN 참고
MSDN은 Microdsoft에서 응용 프로그램 개발자들을 위해 Windows에 관한 기술 문서 등을 제공하는 서비스이다. Win32 API등 다양한 정보들이 포함되어 있다.
Beep function
The frequency of the sound, in hertz. This parameter must be in the range 37 through 32,767 (0x25 through 0x7FFF).
Syntax를 보면 인자 두 개를 가지고 있음을 알 수 있고 , BOOL 성공 또는 실패값으로 들어온다.
Parameters에 인자에 대한 설명이 있다.
deFreq[in] 헤르츠값을 알 수 있고, 십진수 기준으로 37에서 32,767의 값까지 넣을 수 있다.
Return value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
성공할 경우에1을 반환한다 -> EAX레지스터에 리턴값 1이 들어온다.
Beep와 마찬가지로 MSDN를 통해 MessageBox API에 대한 설명을 찾아볼 수 있다.
int MessageBox(
[in, optional] HWND hWnd,
[in, optional] LPCTSTR lpText,
[in, optional] LPCTSTR lpCaption,
[in] UINT uType
);
두 번째 인자는 전달하고자 하는 메시지가 들어가며, 문자열 값이 들어간다.
세 번째 인자는 Caption이 들어가며, MessageBox의 타이틀이다.
네 번째 인자는 버튼의 타입이다.
모든 API를 찾아볼 필요는 없지만, 중요하거나 모르는 API를 찾아보는 것은 중요한 습관이다.
4. 코드분석_level.3 | 파고들기
Hxd.exe*를 사용해서 Sample 01.exe 를 열어보면 파일 데이터를 확인할 수 있다.
*Hxd.exe : 파일 데이터를 16진수 값으로 출력해주는 도구
- PE File Format
실행 파일의 데이터는 Microsoft에서 정한 규칙에 맞게 기록이 되어 있다. 이것을 PE File Format이라고 한다. PE File Format이란 ‘PE 파일이 어떻게 구성되어야 하는지에 대한 규칙’을 뜻한다. 크게 PE 헤더*, text 섹션*, data 섹션*으로 나눌 수 있다.
*PE 헤더 : 파일을 실행시키기 위해 필요한 정보들이 기록되어 있는 영역
*text 섹션 : 파일이 동작하는데 필요한 코드가 기록되어 있는 영역
*data 섹션 : 코드가 실행될 때 필요한 부가적인 정보가 기록되어 있는 영역
PEview.exe : 파일 데이터를 PE File Format에 맞게 나눠서 출력해주는 도구
1. ImageBase = 0x00400000 (메모리에서 샘플 1번 파일의 위치)
2. ImageBase + AddressOfEntryPoint = 0x00401030 (코드 시작 주소)
파일을 올리디버거에 올리면 코드 시작 주소에서 멈춘다.
1. ImageBase = 0x00400000 (메모리에서 샘플 1번 파일의 위치)
2. ImageBase + AddressOfEntryPoint = 0x00401030 (일치)
1. ImageBase = 0x00400000 (일치)
2. ImageBase + AddressOfEntryPoint = 0x00401030 (일치)
∴ 실행 파일과 관련된 정보가 PE 헤더에 있는 것을 확인
5. 코드분석_level.4
분석에서 코드 구현은 확실한 분석이 가능하고 개발과 코드 구현이 가능하면 강력한 무기가 된다.
#include<windows.h>
//윈도우 개발자들이 필요한 다양한 함수, 데이터 타입, API 함수 정의 등을 가진 라이브러리
int main() //메인 함수
{
Beep(0x200, 0x300);
//Beep(경고음) API 추가(windows 라이브러리에서 제공하는 기능)
//첫 번째 인자: 주파수값
//두 번째 인자: 소리 지속시간
MessageBoxA(0, “Hi, Have a nice day!”, “SecurityFactory”, 0);
//메시지 박스 API(windows 라이브러리에서 제공하는 기능)
//첫 번째 인자: 윈도우 핸들값
//두 번째 인자: 메세지 박스에 출력할 문자열
//세 번째 인자: 메세지 박스 제목
//네 번째 인자: 메세지 박스 형태
return 1;
}
'2. Reversing (리버싱) > 1) Write UP' 카테고리의 다른 글
[2023.04.08] 씽씽이 활동보고 (1) | 2023.04.14 |
---|---|
[2023.04.01] 씽씽이 활동보고 (0) | 2023.04.06 |
[2022.11.26]R4 활동보고 (0) | 2022.11.26 |
[2022.11.19] R4 활동일지 - 4강 LENA 17보충 (1) | 2022.11.24 |
Lena's Reversing (15, 17) (0) | 2022.11.12 |