2019.02.03 14:05 악성코드 분석

목록



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 ]



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.02.03
batch (cmd) 난독화  (0) 2019.02.03
Notepad++ 자동화  (0) 2019.01.31
파워셸(PowerShell)과 악성코드  (0) 2019.01.31
Access Token 및 권한과 Integirity Level에 대한 정리  (0) 2019.01.27
인스톨러들 분석  (0) 2018.12.16
Posted by SanseoLab SanseoLab



0. 개요

1. 쓰레기 문자

2. Substring

3. 난독화





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"

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

목록  (0) 2019.02.03
batch (cmd) 난독화  (0) 2019.02.03
Notepad++ 자동화  (0) 2019.01.31
파워셸(PowerShell)과 악성코드  (0) 2019.01.31
Access Token 및 권한과 Integirity Level에 대한 정리  (0) 2019.01.27
인스톨러들 분석  (0) 2018.12.16
Posted by SanseoLab SanseoLab

  여기에는 노트패트 프로그램을 이용한 대량 데이터 처리 자동화에 대해서 정리한다. 그때 그때 괜찮다고 생각되는 부분을 추가할 것이다.



1. 전체 개행 문자 (엔터) 지우기

  "바꾸기" 즉 Ctrl+H를 누른다. 이후 "찾을 내용"에 "\r\n"을 입력하고 "바꿀 내용"은 빈 공간으로 둔다. 즉 개행을 없애는 것이다. 아랫 부분의 "검색 모드"를 "정규 표현식"으로 선택한다. 이제 오른쪽의 "모두 바꾸기" 버튼을 클릭하면 개행이 모두 사라진 결과를 확인할 수 있다.



2. 공백 이전의 문자열 지우기

  "바꾸기" 즉 Ctrl+H를 누른다. 이후 "찾을 내용"에 "^\S+\s+(.+)$"를 입력하고 "바꿀 내용"은 "$1"로 지정한다. 아랫 부분의 "검색 모드"를 "정규 표현식"으로 선택한다. 이제 오른쪽의 "모두 바꾸기" 버튼을 클릭하면 공백 이전의 문자열이 모두 사라진 결과를 확인할 수 있다.


  즉 다음과 같은 내용을,

----

$ ls -al

$ cd ~

----

  아래와 같이 바꾸어 준다.

----

ls -al

cd ~

----


  참고로 "^"는 라인의 시작을, "$"는 라인의 끝을 의미한다. 그리고 \S+는 1개 이상의 비공백(공백이 아닌) 문자를, "\s+"는 1개 이상의 공백 (스페이스 등) 문자를 의미한다. 마지막으로 "(.+)"는 "그룹 1"을 지정하는데, 이것은 1개 이상의 문자를 (결국 해당 라인의 나머지 문자들) 의미한다. 정리해서 말하자면 라인의 시작, 그리고 1개 이상의 비공백 문자, 이후 1개 이상의 공백 문자, 다음으로 1개 이상의 문자부터 끝까지를 정의한다. 


  이에 따라 한 라인에 대하여 시작부터 끝까지 비공백 문자(들), 공백 문자(들), 나머지 문자들(그룹 1)로 나누었다. 그리고 바꿀 문자로는 앞에서 지정한 "그룹 1"인 "$1"을 지정함으로써 결론적으로 처음 공백 및 그 이전의 문자열을 지운 나머지 결과를 얻을 수 있게 된다.



3. 특정 문자열이 들어간 라인 삭제

  "바꾸기" 즉 Ctrl+H를 누른다. 이후 "찾을 내용"에 ".*대상문자열.*[\r]?[\n]"와 같이 적는다. 여기서 "대상문자열"은 이 문자열이 들어간 라인을 삭제하고 싶을 때 지정할 특정 문자열이다. 이후 "바꿀 내용"은 공백으로 둔다. 아랫 부분의 "검색 모드"를 "정규 표현식"으로 선택한다. 이제 오른쪽의 "모두 바꾸기" 버튼을 클릭하면 해당 문자열이 포함된 라인이 모두 사라진 결과를 확인할 수 있다.



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

목록  (0) 2019.02.03
batch (cmd) 난독화  (0) 2019.02.03
Notepad++ 자동화  (0) 2019.01.31
파워셸(PowerShell)과 악성코드  (0) 2019.01.31
Access Token 및 권한과 Integirity Level에 대한 정리  (0) 2019.01.27
인스톨러들 분석  (0) 2018.12.16
Posted by SanseoLab SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday99
Today8
Total28,344

달력

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

글 보관함