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 실제 명령

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



Posted by SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
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

최근에 올라온 글

최근에 달린 댓글

글 보관함