XOR ESI, ESI 명령어는 같은 레지스터를 XOR 연산하게 되면은 0으로 초기화하는 과정입니다.
빨간색으로 네모칸 친 부분이 일련번호 생성 부분이고 차례대로 번호를 붙여서 설명하겠습니다.
입력된 값 : lena151
1. 'MOV EDX, DWORD PTR DS : [403038] '
EDX 레지스터로 DWORD(4바이트) 크기만큼 복사하는 명령어입니다 (WORD는 2바이트)
'403038'에 있는 데이터 4바이트만큼 EDX에 복사한다. 주소에는 '6C 65 6E 61'이 저장되어 있으며, ASCII 코드로 'lena'라고 확인할 수 있습니다.
2. 'MOV DL, BYTE PTR DS : [EAX + 403037]
EAX 레지스터에는 1이 저장되어 있으며, 1 + 403037 = 403038이라고 생각하시면 됩니다.
DL은 EDX에 하위 16비트를 의미하고, BYTE 단위로 복사하기 때문에 하위 1바이트를 복사하여 DL에 저장합니다.
마지막 하위비트를 '6C'이며 메모리는 리틀 엔디안으로 표시하기 때문에 EDX 레지스터에 값은 변화하지 않습니다.
3. ' AND EDX, 000000 FF'
EDX 레지스터 값과 '000000FF' 를 AND 하는 연산
처음 EDX에는 '61 6E 65 6C' 가 들어 있었고, 000000 FF와 AND 연산을 하면 마스크 값이 써지게 되므로
EDX 레지스터의 값은 ' 00 00 00 6C ' 값으로 변경이 됩니다.
4. ' MOV EBX, EDX '
EDX 값을 EBX 에 복사하는 과정입니다.
5. ' IMUL EBX, EDX '
EBX와 EDX를 곱셈 연산을 한 후 EBX에 저장하는 명령어
여기서 MUL은 부호 없는 곱셈 연산 , IMUL 부호 있는 곱셈 연산을 의미합니다.
연산 결과 ' 00 00 2D 90 ' 연산 결과를 EBX에 저장합니다.
6. ' ADD ESI , EBX '
ADD 연산은 뒤에 있는 두 개에 인자를 더세요 연산을 한 후 첫 번째 인자에 결과를 저장하는 명령어
ESI에는 ' 00 00 00 00 ' 이 저장되어 있고, EBX 에는 ' 00 00 2D 90' 이 저장되어 있으므로
연산 결과 값 ' 00 00 2D 90 ' 값이 ESI 저장됩니다.
7. ' MOV EBX, EDX '
EDX 값(' 00 00 00 6C ') 을 EBX 레지스터로 복사
8. ' SAR EBX , 1 '
SAR ( Shift Arithmetic Right) 이란 뜻이며 오른쪽으로 두 번째 값만큼 쉬프트 연산을 하는 명령어
'6C' 값을 비트로 바꾼 후에 오른쪽으로 1비트 이동시키면 결과 값 '36' 이 나옵니다.
(오른쪽 쉬프트는 나누기 , 왼쪽 쉬프트는 곱하기 생각하시면은 이해가 빠를 거 같습니다.)
9. ' ADD EBX , 3 '
EBX 값이 '36' 이므로 '39' 가 된다.
10. ' IMUL EBX, EDX'
EBX 레지스터 값과 EDX 값을 곱하여서 EDX 레지스터 값을 곱해서 EBX 레지스터에 저장하는 명령어
EBX = ' 00 00 00 39 ' , EDX = ' 00 00 00 6C ' 가 저장되어 있으므로 연산 결과 ' 00 00 18 0C ' 가 EBX에 저장
11. ' SUB EBX, EDX '
EBX 값에서 EDX 값을 빼서 다시 EBX에 저장하는 명령어
연산 결과 값 ' 17A0 '이 EBX 저장
12 , 13. ' ADD ESI , EBX ' ' ADD ESI , ESI '
ADD 연산은 위에 나와 있기 때문에 따로 설명하지 않겠습니다.
14. ' INC EAX '
EAX 값을 1 증가 INC은 Increment 로 C언어 같은 경우에 반복문에서 i++이라고 생가하시면 됩니다.
15. ' DEC ECX '
ECX 값을 1 감소 INC 와 반대로 생각
16. ' JNZ SHORT 00401309 '
제로 플래그 값이 ' 1 ' 아니면 주소 ' 00 00 13 09 ' 로 점프하는 점프하는 명령어
거의 CMP 비교 어셈블 다음에 나오는 문장이라고 생각이 듭니다.
**. 코드 캐이브
!!(그림 만들어서 넣기)
리버싱을 하다 보면 코드를 수정해야 할 일이 종종 발생하는데, 새로 입력해야 하는 코드가 기존 코드보다 크기가 작다면은 문제가 없지만 기존 코드보다 큰 코드를 삽입할 경우에, 사용하며 작은 공간에 큰 코드를 집어넣으려는 사용하는 기술
사용하지 않는 코드 영역에 필요한 코드를 입력(Code to Insert) 하고, 수정해야 할 부분에는 새로운 코드가 입력되어 있는 주소로 JMP를 하는 방식이며, 이렇게 하면 내가 필요한 시점에 원하는 코드를 실행할 수 있습니다.
'악성코드 분석 > 리버스 엔지니어링' 카테고리의 다른 글
패킹과 언패킹 (0) | 2020.04.10 |
---|---|
실전 악성코드와 멀웨어 분석 실습 - 11-01 (0) | 2020.02.19 |
[악성코드 분석] 리버스 엔지니어링이란? (0) | 2019.12.20 |