[4] reverseMe.exe 분석
- 2022.01.23 -
** 악성코드는 오로지 교육과 분석의 용도로만 사용하며 획득 경로, 방법에 대해서 배포 및 공유하지 않습니다. **
[Virtual Environments] OS : Windows Architecture : x64 Tools : PEView, PEStudio, IDA |
reversMe.exe파일을 리버싱 해보기로 했다.
일단 해당 파일은 악성코드가 아닌 일반 정상적인 프로그램이다
분석과 전체 구조를 가볍게 공부해야하기에는 가벼운 프로그램만큼 분석이 편한건 없는것같다.
프로그램을 실행하면 위와 같이 나온다. Evaluation period out of date. Purchase new license...
간단히 새로운 라이센스를 구매하라는 메세지가 나오면서 프로그램이 종료가 된다.
일단 이 프로그램을 정적분석을 해본다.
정적분석은 프로그램을 실행하지않고 분석하는 방법으로 프로그램의 전체 구조와 구성요소들을 흝어볼 수 있다.
시그니처의 헥스값은 5A4D..
exe파일들의 MZ시그니처 값은 보통 이렇게 5A4D라는 헥스값을 갖는다.
시그니처는 2바이트의 크기로 존재하며 이 값을 통해서 내가 분석하는 파일이 확장자가 다른 파일로 위장하고 있는지를 1차적으로 확인할 수 있다.
헥스 데이터상에 표현될때는 위에서 보던 방식과는 조금 다르게 표현된다.
바로 리틀엔디언이라는 표현방법으로 2개씩 나누어 거꾸로 표현된다.
5A 4D 라는 값이 리틀엔디언으로 표현되었으니 4D 5A로 표현된다.
[PEview] IMAGE_NT_HEADER > IMAGE_FILE_HEADER > Time Date Stamp
PEView에서 IMAGE_NT_HEADER의 IMAGE_FILE_HEADER로 확인하면 확인 할 수 있다.
Time Date Stamp에서 이 프로그램의 제작날짜를 확인 할 수 있다.
날짜가.. ㅋㅋㅋ 2040년으로 나오는데 버그 아니면 파일 만들 때 날짜를 변경한것 같다. ㅋㅋㅋ
[PEview] SECTION.idata > IMPORT Directory Table
총 7개의 dll파일을 같이 사용하고 있다.
더불어 description에서 각 dll의 설명을 포함하고 있다.
패킹유무도 확인하려 했으나 PEView에서 이상없이 열리는걸 보아 패킹은 따로 되어있는것 같지는 않아보인다.
패킹이 되어있다면 .upx로 패킹되어 열어볼 수 없게 된다.
IDA에서는 text모드와 graph모드 두개를 지원한다.
그 중 그래프 모드에서 본다면 빨간색, 초록색, 파란색 선들이 있는것을 확인 할 수 있다.
빨간색은 조건문 중 거짓일때 이동하는 경로
초록색은 조건문 중 참일때 이동하는 경로
파란색은 조건과 별개로 무조건적으로 이동하는 경로이다.
예를 들면 jnz일때 값이 0일때는 거짓, 1일때는 참으로 분류되어 이동한다.
jnz (jump if not zero)의 약자로 값이 0이 아닐때 점프와 같다. 따라서 값이 0이라면 거짓 1이라면 참인 셈이다.
jnz는 어셈블리어 이므로 이 외 명령어 설명을 알고 싶다면 여기로!
메모리주소 0x00401000에서 push를 통해 0의 값을 넣는다. 보통 새로운 프로세스를 시작할때 시작점을 가리키는 포인터를 올려주기 위해 새로운 프로세스를 시작할때에 push를 넣고 포인터를 통해 메모리의 위치를 표시한다.
우리가 여기에서 확인할 사항은 메모리주소 0040106E와 00401073인데 이중 0040106E를 보면 push 명령어를 통해서 Keyfile.dat 파일을 메모리주소 00401073에 위치한 CreateFile함수를 이용해 여는 것이다.
이 함수는 파일을 생성하는 함수이지만 생성 뿐만아니라 실행하기위한 함수로도 사용된다.
그러나 우리가 최초에 이 프로그램을 실행했을 때 이 파일이 없었기 때문에 메모리주소 00401084와 같은 text 메세지가 출력되는 것이다. 그리고 ExitProcess를 통해서 프로그램 종료..
그렇다면 이 파일이 있다면 어떻게 될까? 여기에서 조건이 붙게되는데 메모리주소 00401078을 보면 cmp(compare)명령어이다. 즉 값을 비교하는 비교연산자인데 0FFFFFFFFh와 eax값을 서로 비교한것이다. 그리고 그 다음 주소 0040107B에서 jnz명령어를 통해 flag가 0인지 1인지 확인하는것이다. 이것에 따라서 거짓일 경우 그 밑 주소 00401084에서 push하는 text를 띄우고 마지막 줄의 ExitProcess를 통해 프로그램을 종료하고 그렇지 않을 경우 옆의 점선을 통해서 다음 명령줄로 이동하는 것이다.
그 다음 메모리주소 0040107B의 jnz중 1의 거짓이 아닌 0의 참일때를 따라가 보았다.
jnz가 가리키는 주소는 0040109A인데 이쪽은 단순히 파일을 읽어들이는 영역인것같아 보인다.
아래에서 두번째의 메모리주소 004010B0에서 jnz가 다시 등장한다. 위의 읽어들이는 영역에서 값이 참일때 점프 아닐때 그대로 아래 명령줄로 이동하는것 같다.
우리는 0의 참으로 이동한다. 메모리주소는 4010B4. 즉, 004010B4로 이동해본다.
위에서 jnz가 가리키는 004010B4로 이동해 보았다.
여러 명령어를 확인할 수 있는데 xor, cmp, jl,jz,jnz,jmp등 여러 명령어가 확인되고 여러 점프 지점들이 보인다.
하나하나 확인해 본다.
메모리주소 004010BF 의 jl명령어에서 바로 윗줄의 cmp. 비교값의 결과 중 A와 B중 왼쪽 값이 작으면 점프, 아니면 진행.
즉, A,B를 비교해보고 왼쪽의 값이 작으면 참, 아니면 거짓이란 뜻으로 해석된다. 여기서 우리는 왼쪽의 값이 더 큰 거짓으로 해석한다.
거짓 = 진행 이므로 메모리주소 004010C1을 지나 cmp 그리고 jz명령어를 확인한다. jz는 jump if zero의 뜻으로 flag값이 0일때 점프 아니면 진행 이라는 뜻이다.
여기에서 점프를 하지않고 진행하는 쪽으로 가다보면 메모리주소 004010D1에서 jmp. 즉, 점프를 통해 다시 이전으로 돌아가는 상황이 발생한다. 값을 계속 검사, 인증절차를 확인하는 영역같아 보인다. 해서 진행이 아니라 점프를 하는 쪽으로 다시 돌아가 확인한다.
jz short loc_4010D3을 확인해보면 어디로 점프할지 가리키는 곳이 있다.
메모리 주소 004010D3으로 이동해서 확인하면 cmp를 통해 값을 비교하고 jl을 지나 jmp가 가리키는 메모리주소로 이동해본다. 메모리주소는 00401205이다.
메모리주소 00401205로 이동해 보았다.
메모리주소 0040120C를 보면 PUSH로 You really did it! Congratz !!! 라는 메세지를 00401213의 call명령어인
MessageBox 함수를 통해 호출하고 그 다음 명령줄인 ExitProcess를 통해 프로세스를 종료하는것을 볼 수 있다.
이 전 사진의 인증관련 영역을 사용자가 건드리고 조작한다면 구매하라는 문구나 실패 문구가 뜨지 않고 통과할 수 있을 것이다.
추가로 만약 인증절차에 실패했다면 호출되는 메세지 문구 이다.
마 치 며
그동안 여러 공부들과 강의들을 참고하고 공부한 보람이 있다..
뭔가 각 명령어들에 대한 의미와 진행방향들을 알 수 있었는데.
강의가 큰 도움이 된 것 같다. 이번 분석은 비교적 매우 간단한 프로그램 분석이기에
앞으로 시도할 실제 악성코드에 비하면 현저히 간단한 코드임에는 틀림없다.
그러나 push가 뭐고 jnz가 뭐고 jz jl cmp 등등
보고도 뜻을 알 수 없었던 명령어들이 이제 조금씩 눈에 들어오기 시작해서 기분이 좋다.
더구나나 이번 분석은 강의에서 지도하는대로 따라가는것이 아닌 내가 직접 열어서
하나하나 주석과 설명을 달면서 하는 이해하며 넘어가는 분석이라 큰 의미가 있었던 것 같고
기존에 분석해서 올렸던 게시글들 보다는 비교적 분석의 완성도가 높은것 같다.
다음에 진짜 악성코드를 분석했을 때 이처럼 완성도있게 분석해보고 싶다.
'Malicious Code > Analysis' 카테고리의 다른 글
[6] 악성코드 분석 (0) | 2022.01.31 |
---|---|
[5] 악성코드 분석 (0) | 2022.01.28 |
[3] 악성코드 분석 (0) | 2021.11.08 |
[2] 악성코드 분석 (0) | 2021.11.08 |
댓글
이 글 공유하기
다른 글
-
[6] 악성코드 분석
[6] 악성코드 분석
2022.01.31 -
[5] 악성코드 분석
[5] 악성코드 분석
2022.01.28 -
[3] 악성코드 분석
[3] 악성코드 분석
2021.11.08 -
[2] 악성코드 분석
[2] 악성코드 분석
2021.11.08