악성코드 해시(SHA256) - 70642465f22ee0d78b3d91262a0249fd08afd372ada63d80d9699b6a429383f2
악성코드 포맷 - PE
악성코드 타입 - Ransom:StopCrypt (Microsoft)
운영체제 - Windows(x86)
해당 분석을 정적 디컴파일러로 분석하려 하였으나, 해석에 어려움이 있어 동적 디컴파일러를 사용하였다.
x32dbg로 해당 프로그램을 연 후 main함수를 찾아간다.
GetCurrentProcessId
,GetCurrentThreadId
,GetStartupInfowStub
등의 API는 대부분 컴파일러가 작성하는 전처리코드에 등장한다.코드를 스킵하면서 가던 중, ret으로 프로그램이 반드시 끝나는 구문이 오기 전의 call문을 찾으면, 해당 부분이 main에 해당한다.
main함수에 들어가면 아래와 같은 의미없는 함수콜이 보이게 된다. 해당 프로그램은 본격적으로 RWX 가능한 섹션에 들어가기 전에 다음과 같은 구간이 많으므로, 각 섹션에 대한 설명만 하고 지나가겠습니다.
[0x40378D : 0x40380F]
- 조건문에 걸려 타지 않는 함수콜입니다.0x403827
- 이후에 ret으로 프로그램이 종료하게 되므로0x402EE0
함수를 진행합니다.[0x402EED : 0x402F97]
- 조건문에 걸려 타지 않는 함수콜입니다.[0x402FAA : 0x403022]
- 읽고 쓰고 실행할 수 있는 공간을 할당합니다.[0x403040 : 0x4030A7]
- 계속 루프를 돌지만, 조건문에 걸려 내부의[0x40304B : 0x40309D]
영역의 함수콜을 진행하지 않습니다. 백신 속이기 용 무의미한 루프로 판단됩니다.[0x4030D2 : 0x4036BD]
- 할당한 RWX섹션에 실행할 코드를 넣고 있습니다. 루프때문에 몇 번 반복합니다.0x4036DD
- 해당 조건문을 통해 몇 번 반복한 루프를 탈출합니다.[0x4036F0 : 0x4036FF]
- 의미 없는 함수콜(GetMenuItemID, LoadMenuA)를 반복합니다. 백신 속이기 용 무의미한 루프로 판단됩니다.0x403701 - 0x402E20
함수로 들어갑니다.[0x402E20 : 0x402EAC]
- 조건문에 걸려 타지 않는 루프에 무의미한 함수 콜이 있는 것 같습니다. 백신 피하기 용 무의미한 루프로 판단됩니다. 이 때,0x402C50
함수를 타 메모리 영역을 이동하거나 하는 것으로 보이나, 중요한 로직이 아닌 것 같아 패스하였습니다.
0x403707 - 0x402EC0
함수로 들어가나, 내부에 특별한 사항은 없습니다.[0x403714 : 0x403727]
- 불필요한 루프입니다.[0x403743 : 0x40378B]
- 조건문에 걸려 내부 무의미한 함수콜을 타지 않는 루프입니다.[0x4037A2]
- RWX영역에 진입합니다. 이후의 영역 주소는 계속 변하게 됩니다.
이후 RWX영역에 들어간 후 코드가 실행됩니다.
첫번째 함수 콜에서는 실행에 필요한 여러 라이브러리를 불러오는 부분으로 보입니다. 다만 코드의 길이가 길어 제대로 확인하지 못하였습니다.
두번째 함수 내부에 들어간 후, 정상적으로 실행영억으로 볼 수 있는 부분이 나옵니다.
해당 부분을 보면 CreateToolhelp32Snapshot
및 Module32First
을 통해 현재 실행하는 프로세스 목록을 가져오고 특정 함수 수행 후 프로그램을 종료하고 있습니다.
위의 패턴을 보아, 해당 함수는 pid를 입력값으로 받아 메모리를 감지하거나, 조작하거나, 코드를 삽입할 것으로 예상됩니다.
해당 함수의 내부는 다음과 같이 동작합니다.
A + 0x26
- 특정[X1]
함수에 들어가 무의미한 루프를 진행합니다.A + 0x51
- 새로운 메모리 영역을 할당합니다.A + 0x6F
- 함수[X2]
를 실행해 ebp를 조정합니다.A + 0x88
-jmp dword ptr ss:[ebp - 4]
을 통해 실재 로직의 진행부분 B로 들어갑니다.경험상 진행부분 B는 뒷자리가 0000으로 끝나는 것 같습니다.
B + 0x2B
- 함수[X3]
에 들어가, 특정 라이브러리를 불러와 사용합니다. 안티디버깅을 하는지 확인하진 못하였습니다.B + 0x33
- 몇 줄 뒤로 넘어가 코드를 수행합니다. 다음 줄은 실행되지 않으므로 안으로 들어가야 합니다.B + 0x4C
- 함수[X4]
에 들어가 반복문을 도는 것 같습니다. 안티디버깅을 하는지 확인하진 못하였습니다.[B + 0x51 : B + 0x218]
- 커널 라이브러리를 불러와 새로운 공간을 할당하고 특정 공간 할당을 해제합니다. 이떄TerminateProcess
와ExitProcess
를 실행하는 코드도 보였습니다.B + 0x21E
- 함수[X5]
에 들어가 에러모드를 설정한 후, 조건이 맞으면 프로그램 종료를 수행하는것으로 보입니다.B + 0x233
- 함수[X6]
에 들어가 몇 기능을 수행합니다. 안티디버깅을 하는지 확인하지 못하였습니다.B + 0x24D
- 새 공간을 할당합니다.B + 0x2E3
- 새 공간 권한을 할당합니다.B + 0x306
- 함수[X7]
에 들어가 몇 기능을 수행합니다.[B + 0x30E : B + 0x440]
- 새 공간에 코드를 복사하는것으로 보입니다.B + 0x443
- 특정 공간 할당을 해제합니다.[B + 0x446 : ]
- 계속해서 새 공간에 코드를 복사하는것으로 보입니다. 중간중간 진행한 안티디버깅의 결과에 따라 루프를 타는 것 같았습니다.B + 0x89A
-msvcr100.dll
을 로드합니다.B + 0x91E
- 실제 실행 주소를 호출합니다. (호출 주소는0x40324C
로 고정입니다.)
이후 부분은 해석하지 않았습니다.
이후 부분을 확인하지 않고 실행해 보앗는데 충돌이 났었습니다. PID 1(SYSTEM)을 가져갔는데 권한이 모자라 프로그램이 충돌 난 것으로 보입니다.
자주 보이던 패턴이여서 프로텍터를 더미다로 추측하였습니다.