728x90
반응형
목차
0. Ransomware 파일 내부
  1) file 정보

  2) readme.txt 파일
  3) run.exe 파일
1. run.exe 파일 실행
  1) Exeinfo.exe 설치
  2) HxD 설치
  3) UPX 설치
  4) OllyDbg 설치
  5) WOW64 설치
2. IDA run.exe 파일 분석
3. OllyDbg run.exe 파일 분석
4. Key값 구하기
5. 소스코드 정리 및 연산 수행
6. 최종 실행 및 Flag 확인

[Review] (5주차) 실습

2022.08.06 - [Security & Analysis/IDA Pro] - [IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)

 

[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)

목차 1. Easy ELF 실습 - 실습을 위한 사전 단계(Linux 파일 실행) 2. 분기문 분석 3. byte 및 배열 정리 4. 소스코드 작성(어셈블리어 기반) [Review] (4주차) 이론 - 총정리 2022.07.19 - [Security & Analysis/..

sarahee.tistory.com


0. Ransomware 파일 내부

랜섬웨어 암호화 file 및 txt, exe 파일

zip 파일의 압축을 풀면 다음과 같이 file 및 txt, exe 총 3개의 파일 생성

file에 파일 확장자가 없기 때문에 바이너리 형식으로 암호화되었다고 판단

따라서 16진 편집기인 HxD 사용 예정

1) file 정보

2) readme.txt 파일

file 확장자가 exe

ui 파일을 .py로 변경(Pyutic)

3) run.exe 파일


1. run.exe 파일 실행

IAT: Import Address Table, 프로그램이 어떤 라이브러리에서 어떤 함수를 쓰는지 기술한 테이블

프로그램이 특정 API를 실행하고자 할 때 IAT를 불러옴

압축되어 있어서 확인 불가

해당 파일이 압축되어 있어서, 내부 정보 확인이 불가

1) Exeinfo PE 파일 다운로드하여 정보 확인

https://exeinfo-pe.kr.uptodown.com/windows

 

Exeinfo PE (Windows)

Exeinfo PE을 위한 Windows을 무료로 다운로드하세요. .exe 파일 확인하기. Exeinfo PE는 여러분이 .exe 파일들을 확인하여 그 속성을 살펴볼 수 있는 프로그램입니다. 또한, 해당 파일의 이름을 변경하고

exeinfo-pe.kr.uptodown.com

파일이 UPX로 패킹되어 있음

(언패킹된 프로그램을 출력 시 컴파일된 언어 등 조회 가능)

2) HxD 설치

Window 용 16진 편집기, 디스크/메모리 편집기, 프로세스 실행에 사용되는 메모리를 표시하고 편집할 수 있음

https://mh-nexus.de/en/downloads.php?product=HxD20 

3) UPX 설치

하단 Unpack info

Big sec. 2 [ UPX1 ] , unpack "upx.exe -d"  from  http://upx.github.io or any UPX/Generic unpacker

해당 사이트에 접속하여 설치 진행

UPX란?

the Ultimate Packer for eXecutables, 오픈 소스 실행 파일 압축 프로그램

Download latest release > upx-3.96-win64.zip
다운로드 받은 upx.exe 파일을 unpacking하고자 하는 exe 파일에 위치

upx.exe -d run.exe

Not packed, 내부 정보 확인 가능

4) OllyDbg 설치

https://www.ollydbg.de/download.htm

5) WOW64 설치

운영체제의 하위 시스템, 32비트 윈도우와 64비트 윈도우의 차이 보완

모든 64비트 버전의 마이크로소프트 윈도우에서 32비트 응용 프로그램들이 돌아가도록 도와줌

https://ko.dll-files.com/wow64.dll.html

zip 파일 압축 해제 후, regsvr32 wow64.dll


2. IDA run.exe 파일 분석

cmd 명령어에서 확인한 Key 문자열 검색하여 알고리즘 확인

Key의 입력값이 byte_44D370에 저장

call [접근할 함수 주소]

file 문자열 확인

StartAddress Functions 내부 file open

함수 시작 부분에 코드 반복 ← 파일 크기 키우고, 분석에 어려움을 주기 위함

 

rb는 file을 읽는 형식

read binary, 즉 바이너리 형식으로 파일을 읽겠다는 의미

 

좌측 printf: '파일을 찾을수 없다!' 문자열 출력 구문

 

하단 Stream

* Stream: 컴퓨터 처리 환경에서, 시간이 지남에 따라 사용할 수 있게 되는 일련의 데이터 요소

fseek: fopen으로 호출된 파일의 위치 변경

ftell: 스트림 위치 지정자의 현재 위치(파일 포인터)

feof: stream(FILE)의 파일 끝 플래그가 설정되었는지 여부 표시, 파일의 끝 위치 확인

fgetc: 파일에서 글자를 하나씩 읽는 함수

→ feof를 이용해 파일의 끝에 도달할 때까지 fgetc 함수를 통해 1byte씩 file 파일로부터 읽어들임

wb, binary 형식으로 file을 쓰겠다는 의미

  • 좌측 하단 printf: '파일을 복구했다! ~' 문자열 출력
  • 우측에 핵심 부분으로 복호화를 수행하는 loop 존재

알고리즘 loop

1) xor edx, edx - ebp+Stream 등.. 의미 없음(모두 0이 되므로, 초기화하는 과정)

2) div [ebp+var_C] - 입력한 key가 DIV 연산에 의해 끝 byte에 도달했을 때, 처음 byte로 돌아감

3) xor ecx, edx - input으로 입력한 key 중 한 byte와 XOR 연산 수행(ecx: 입력값(반복 카운터), edx: key값)

4) xor edx, 0FFh - 위의 결과와 0xFF XOR 연산 수행

 

XOR 연산의 성질에 의해, Key를 찾기 위해 file 파일과 0xFF를 XOR

Original File을 바이트 단위로 XOR

Original File은? readme.exe 파일의 hint에 의해 복호화된 파일은 exe 파일(PE구조)이라는 것을 판단

 


3. OllyDbg run.exe 파일 분석

run.exe file open


4. Key값 구하기

file이 exe 포맷이므로, header 구조는 다른 exe 파일과 동일할 것

upx.exe, run.exe

00000000 ~ 00000070까지 대부분 동일한 헤더값을 가지며,(00000030의 F0, 80 차이)

키 값을 모르기 때문에 0x20 크기 복호화

  • 복호화 되어야 할 값:
  • 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00
B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 F0 00 00 00
0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68
69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F
74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20
6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00

 

file

  • 암호화된 값: 
  • DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B 34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93
DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B
34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93
9E 86 9C 97 9A 8C 8C 93 9A 8B 8C 8F 93 9E 86 9C
97 9A 8C 8C 93 9A 8B 8C 8F 93 9E 86 6C 97 9A 8C
82 8C 20 85 8C 3B 9A 53 A7 24 96 D6 41 AD C7 F2
E2 FF AF E3 EC E9 FB E5 FB E1 AC F0 FB E5 E2 E0
E7 BE E4 F9 B7 E8 F9 E2 B3 F3 E5 AC CB DC CD A6
F1 F8 FE E9 A2 9E 97 81 A8 8F 93 9E 86 9C 97 9A

5. 소스 코드 정리 및 연산 수행

해당 파일이 최종 구현된 소스코드

key = input('Key : ').encode()

f = open('./ransomware/file', 'rb')
enc_content = f.read()
f.close()

dec_content = []
for i in range(len(enc_content)):
    dec_content.append(enc_content[i] ^ key[i % len(key)] ^ 0xFF)
dec_content = bytes(dec_content)

f = open('file', 'wb')
f.write(dec_content)
f.close()

 

de_file[i] = en_file[i] ^ key[i] ^ 0xFF → key[i] = en_file[i] ^ de_file[i] ^ 0xFF

원본 데이터가 반복이라면, key 값만 달라지기 때문에 key의 길이만큼 동일 데이터가 반복될 것

 

# sol1

# 20 bytes
# 암호화된 값 : DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B 34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93
# 복호화 되어야 할 값: 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00

enc_content = [0xDE, 0xC0, 0x1B, 0x8C, 0x8C, 0x93, 0x9E, 0x86, 0x98, 0x97, 0x9A, 0x8C, 0x73, 0x6C, 0x9A, 0x8B, 0x34, 0x8F, 0x93, 0x9E, 0x86, 0x9C, 0x97, 0x9A, 0xCC, 0x8C, 0x93, 0x9A, 0x8B, 0x8C, 0x8F, 0x93]
dec_content = [0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

key = ''
for i in range(len(enc_content)):
    key += chr(dec_content[i] ^ enc_content[i] ^ 0xFF)
print(key)

# sol2

enc_content = "DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B 34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93".split(' ')
dec_content = "4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00".split(' ')

for i in range(len(enc_content)):
    enc_content[i] = int(enc_content[i], 16)
    dec_content[i] = int(dec_content[i], 16)
    enc_content[i] = enc_content[i] ^ 0xFF
    enc_content[i] = enc_content[i] ^ dec_content[i]
    print(chr(enc_content[i]), end="")

결과값: letsplaychess 반복


6. 최종 실행 및 Flag 확인

기존의 file을 확장자 변경(exe) 후 실행하면, 다음과 같이 실행 불가

run.exe 파일 실행 후 결과값(Key : letplaychess) 입력

 

 

728x90
728x90
728x90
반응형

apk 파일이란?

Android Package Kit, Google의 Android OS에 애플리케이션을 배포하는 데 사용되는 Android 패키지 파일의 확장

Windows OS의 소프트웨어 설치를 위한 exe 파일과 동일한 유형

안드로이드 프로그램 애플리케이션의 모든 데이터 포함

 

Windows에서 APK 파일을 열기 위해서는 Android Studio와 같은 cross platform 개발 환경 필요

text 형식으로 파일을 오픈할 경우
Stay in LightEdit 버튼 클릭
파일이 binary 형식으로 열려 깨짐

APK Analyzer로 빌드 분석 방법

https://developer.android.com/studio/debug/apk-analyzer?hl=ko 

 

APK Analyzer로 빌드 분석  |  Android 개발자  |  Android Developers

Android 스튜디오에는 빌드 프로세스가 완료된 후 APK 구성에 관한 유용한 정보를 즉시 제공하는 APK Analyzer가 포함됩니다.

developer.android.com

 

압축 해제하여 내부 폴더/파일 및 소스 코드 조회

Android.apk folder  
META-INF 서명 및 아카이브의 리소스 목록, 매니페스트 파일 포함
lib 장치의 특정 아키텍처에서 실행되는 기본 라이브러리
res resources.arsc로 컴파일되지 않은 리소스(e.g. image)
assets 번들로 제공하는 리소스의 원시 파일(개발자가 앱과 함께 제공)
r 안드로이드 개요 참조? xml 파일 (http://schemas.android.com/apk/res/android)
Android.apk file  
AndroidManifest.xml APK 파일의 콘텐츠, 버전, 이름에 대한 설명 제공
class.dex 컴파일된 Java 클래스(기기 내 실행)
resources.arsc 앱에서 사용하는 컴파일된 리소스(e.g. 문자열)

 

eyes sources > assets > web > login.html 내 내부 연결 사이트 존재

		<div class="row footer">
			 <div class="sns"><!-- target="_blank"  -->
			 	<a href="http://m.facebook.com/pages/%EA%B3%B5%EC%A6%9D%EC%A0%9C%EB%8F%84%ED%99%8D%EB%B3%B4/455469054516582?ref=hl" class="ic-sns ic-sns-f mr-20" target="_blank"></a>
			 	<a href="http://pf.kakao.com/_GSxeTC" class="ic-sns ic-sns-p mr-20" target="_blank" ></a>
			 	<a href="http://m.blog.naver.com/notary_legal" class="ic-sns ic-sns-n" target="_blank" ></a>
			 </div>

법무부 공식 페이지 URL과 상이하며, 현재 카카오톡 채널은 비공개 혹은 삭제된 프로필로 표시

 

eyes sources > assets > web > end.html 내 코드

기타 버튼을 누를 경우, 법무부 전자공증시스템(공식 홈페이지, enotary.moj.go.kr) 연결

<div class="panel-group" id="menus">
   <div class="panel panel-dafault">
      <div class="panel-heading">
         <h4 class="panel-title">
            <a data-toggle="collapse" data-parent="#menus" href="#menu1">내 신청내역
               <i class="menu-in"></i>
            </a>
         </h4>
      </div>
      <div id="menu1" class="panel-collapse collapse in">
      
         <div class="panel-body text-center">
            <p>로그인을 하시면 편리한 화상공증 서비스를</p>
            <p>이용하실 수 있습니다.</p>
            <a href="https://enotary.moj.go.kr/mobile/login.jsp" class="btn btn-sidebar-login">로그인</a>
         </div>
      
      </div>
   </div>
   <div class="panel panel-dafault">
      <div class="panel-heading">
         <h4 class="panel-title">
            <a data-parent="#menus" href="https://enotary.moj.go.kr/mobile/office_search/office_search.jsp">사무소 찾기
               <i class="menu-out"></i>
            </a>
         </h4>
      </div>
   </div>
   <div class="panel panel-dafault">
      <div class="panel-heading">
         <h4 class="panel-title">
            <a data-toggle="collapse" data-parent="#menus" href="#menu3">공증안내
               <i class="menu-out"></i>
            </a>
         </h4>
      </div>
      <div id="menu3" class="panel-collapse collapse">
         <div class="panel-body">
            <ul>
               <a href="https://enotary.moj.go.kr/mobile/enotary_guide/about.jsp"><li>공증제도</li></a>
               <a href="https://enotary.moj.go.kr/mobile/enotary_guide/law.jsp"><li>공증법령</li></a>
               <a href="https://enotary.moj.go.kr/mobile/enotary_guide/guide.jsp"><li>전자공증안내</li></a>
               <a href="https://enotary.moj.go.kr/mobile/enotary_guide/howtouse.jsp"><li>전자공증이용방법</li></a>
            </ul>
         </div>
      </div>    
   </div>
   <div class="panel panel-dafault">
      <div class="panel-heading">
         <h4 class="panel-title">
            <a data-toggle="collapse" data-parent="#menus" href="#menu4">고객센터
               <i class="menu-out"></i>
            </a>
         </h4>
      </div>
      <div id="menu4" class="panel-collapse collapse">
         <div class="panel-body">
            <ul>
               <a href="https://enotary.moj.go.kr/mobile/customer/notice.jsp"><li>공지사항</li></a>
               <a href="https://enotary.moj.go.kr/mobile/customer/uselist.jsp"><li>전자공증 활용사례</li></a>
               <a href="https://enotary.moj.go.kr/mobile/customer/util.jsp"><li>자료실</li></a>
               <a href="https://enotary.moj.go.kr/mobile/customer/qa.jsp"><li>Q&amp;A</li></a>
               <a href="https://enotary.moj.go.kr/mobile/customer/faq.jsp"><li>FAQ</li></a>
               <a href="https://enotary.moj.go.kr/mobile/customer/documents.jsp"><li>공증사무소 방문 시 지참서류</li></a>
               <a href="javascript:setGongin();" id="gongin"><li>공인인증센터</li></a>
               <script>
                  function setGongin(){
                     location.href = "https://enotary.moj.go.kr/mobile/customer/gongin.jsp"
                  }
               </script>
            </ul>
         </div>
      </div>
   </div>
</div>

프로그램 보안 검사

전체 251개의 앱을 검사하는 과정이며, 내부 악성 앱을 설치하는 요소가 포함되는지 확인

// 2.html file
<body>
  <div class="main" id="app">
    <div class="center-img display-flex flex-align-center flex-justify-center ">
      <img src="./img/ic_launcher_round.png" alt="">
    </div>
    <div class="folder-text fontSize-14 text-center">{{`설치된 ${total}개의 앱중에서 ${num}번째 앱을 검사 중입니다.`}}</div>
    <div class="folder-loop fontSize-12 text-center">
      {{folderText}}
    </div>
  </div>

// ----------

data() {
  return {
    total: 251,
    num: 0,
    folderText: '',
    json: [
      "com.google.omadm.trigger",
      "com.google.android.carriersetup",
      "com.android.cts.priv.ctsshim",
      "com.google.android.youtube",
      "com.vzw.apnlib",
      "com.android.internal.display.cutout.emulation.corner",
      "com.google.android.ext.services",
      "com.android.internal.display.cutout.emulation.double",
      "com.google.android.overlay.pixelconfig2017",
      "com.google.android.overlay.pixelconfig2018",
      "com.android.providers.telephony",
      "com.android.dynsystem",
      "com.android.sdm.plugins.connmo",
      "com.google.android.googlequicksearchbox",
      "com.android.providers.calendar",
      "com.android.providers.media",
      "com.google.android.apps.docs.editors.docs",
      "com.google.android.onetimeinitializer",
      "com.google.android.ext.shared",
      "com.android.internal.systemui.navbar.gestural_wide_back",
      "com.quicinc.cne.CNEService",
      "com.estsoft.alyac",
      "com.android.theme.color.cinnamon",
      "com.google.android.apps.diagnosticstool",
      "com.google.euiccpixel",
      "com.android.theme.icon_pack.rounded.systemui",
      "com.android.simappdialog.auto_generated_rro_product__",
      "com.android.safetyregulatoryinfo.auto_generated_rro_product__",
      "com.android.externalstorage",
      "com.google.android.apps.enterprise.dmagent",
      "com.android.htmlviewer",
      "com.qualcomm.qti.uceShimService",
      "com.android.companiondevicemanager",
      "com.verizon.obdm_permissions",
      "com.android.mms.service",
      "com.android.providers.downloads",
      "com.google.android.cbrsnetworkmonitor",
      "com.android.sdm.plugins.usccdm",
      "com.android.systemui.auto_generated_rro_product__",
      "com.google.android.apps.messaging",
      "com.google.android.soundpicker",
      "com.android.theme.icon_pack.rounded.android",
      "com.breel.wallpapers18",
      "com.qualcomm.qti.telephonyservice",
      "com.android.theme.icon_pack.circular.themepicker",
      "com.google.android.configupdater",
      "com.google.android.overlay.googlewebview",
      "com.google.android.apps.safetyhub",
      "com.android.timezone.updater",
      "com.google.ar.core",
      "com.android.providers.downloads.ui",
      "com.android.vending",
      "com.android.pacprocessor",
      "com.android.simappdialog",
      "com.nuts.extremspeedup",
      "com.android.internal.display.cutout.emulation.tall",
      "com.android.certinstaller",
      "com.android.theme.color.black",
      "com.google.android.marvin.talkback",
      "com.android.theme.color.green",
      "com.android.theme.color.ocean",
      "com.android.theme.color.space",
      "com.android.internal.systemui.navbar.threebutton",
      "com.google.android.apps.work.oobconfig",
      "com.qti.qualcomm.datastatusnotification",
      "com.google.android.pixel.setupwizard",
      "com.android.theme.icon_pack.rounded.launcher",
      "com.google.android.grilservice",
      "com.android.egg",
      "com.android.mtp",
      "com.android.nfc",
      "com.android.ons",
      "com.android.stk",
      "com.android.backupconfirm",
      "com.android.theme.font.arvolato",
      "com.android.systemui.auto_generated_rro_vendor__",
      "com.google.android.deskclock",
      "com.android.internal.systemui.navbar.twobutton",
      "com.android.statementservice",
      "com.android.hotspot2",
      "com.google.android.as",
      "com.google.android.gm",
      "com.google.android.carrier",
      "com.google.android.apps.tachyon",
      "com.android.sdm.plugins.sprintdm",
      "com.android.internal.systemui.navbar.gestural_extra_wide_back",
      "com.google.android.permissioncontroller",
      "com.google.intelligence.sense",
      "com.google.android.setupwizard",
      "com.qualcomm.qcrilmsgtunnel",
      "com.android.providers.settings",
      "com.android.sharedstoragebackup",
      "com.verizon.services",
      "com.android.nfc.auto_generated_rro_product__",
      "com.google.android.euicc",
      "com.google.android.music",
      "com.android.printspooler",
      "com.android.hotwordenrollment.okgoogle",
      "com.android.sdm.plugins.diagmon",
      "com.android.theme.icon_pack.filled.settings",
      "com.android.dreams.basic",
      "com.android.providers.settings.auto_generated_rro_product__",
      "com.android.se",
      "com.android.inputdevices",
      "com.google.android.apps.wellbeing",
      "com.google.android.dialer",
      "com.android.bips",
      "com.google.audio.hearing.visualization.accessibility.scribe",
      "com.google.android.captiveportallogin",
      "com.android.theme.icon_pack.circular.settings",
      "com.google.android.accessibility.soundamplifier",
      "com.qti.xdivert",
      "com.android.musicfx",
      "com.google.android.apps.docs",
      "com.google.android.apps.maps",
      "com.google.android.apps.tips",
      "com.google.android.documentsui.theme.pixel",
      "com.google.android.modulemetadata",
      "com.android.bluetooth.auto_generated_rro_vendor__",
      "com.google.android.markup",
      "com.android.providers.settings.auto_generated_rro_vendor__",
      "com.android.cellbroadcastreceiver",
      "com.google.android.webview",
      "com.android.theme.icon.teardrop",
      "com.google.android.apps.carrier.log",
      "com.google.android.networkstack",
      "com.google.android.contacts",
      "com.android.server.telecom",
      "com.google.android.syncadapters.contacts",
      "com.android.theme.icon_pack.rounded.themepicker",
      "com.android.keychain",
      "com.android.server.tele",
      "com.auto_generated_rro_product__",
      "com.google.android.overlay.googleconfig",
      "com.google.android.calculator",
      "com.android.service.ims",
      "com.android.chrome",
      "com.android.bips.auto_generated_rro_product__",
      "com.android.theme.icon_pack.filled.systemui",
      "com.google.android.packageinstaller",
      "com.google.android.apps.customization.pixel",
      "com.google.android.gms",
      "com.google.android.gsf",
      "com.google.android.ims",
      "com.google.android.tag",
      "com.google.android.tts",
      "com.google.android.overlay.permissioncontroller",
      "com.android.calllogbackup",
      "com.google.android.partnersetup",
      "com.android.safetyregulatoryinfo",
      "com.google.android.apps.wallpaper.nexus",
      "com.android.dynsystem",
      "com.android.sdm.plugins.connmo",
      "com.google.android.googlequicksearchbox",
      "com.android.providers.calendar",
      "com.android.providers.media",
      "com.google.android.apps.docs.editors.docs",
      "com.google.android.onetimeinitializer",
      "com.google.android.ext.shared",
      "com.android.internal.systemui.navbar.gestural_wide_back",
      "com.quicinc.cne.CNEService",
      "com.estsoft.alyac",
      "com.android.theme.color.cinnamon",
      "com.google.android.apps.diagnosticstool",
      "com.google.euiccpixel",
      "com.android.theme.icon_pack.rounded.systemui",
      "com.android.simappdialog.auto_generated_rro_product__",
      "com.android.safetyregulatoryinfo.auto_generated_rro_product__",
      "com.android.externalstorage",
      "com.google.android.apps.enterprise.dmagent",
      "com.android.htmlviewer",
      "com.qualcomm.qti.uceShimService",
      "com.android.companiondevicemanager",
      "com.verizon.obdm_permissions",
      "com.android.mms.service",
      "com.android.providers.downloads",
      "com.google.android.cbrsnetworkmonitor",
      "com.android.sdm.plugins.usccdm",
      "com.android.systemui.auto_generated_rro_product__",
      "com.google.android.apps.messaging",
      "com.google.android.soundpicker",
      "com.android.theme.icon_pack.rounded.android",
      "com.breel.wallpapers18",
      "com.qualcomm.qti.telephonyservice",
      "com.android.theme.icon_pack.circular.themepicker",
      "com.google.android.configupdater",
      "com.google.android.overlay.googlewebview",
      "com.google.android.apps.safetyhub",
      "com.android.timezone.updater",
      "com.google.ar.core",
      "com.android.providers.downloads.ui",
      "com.android.vending",
      "com.android.pacprocessor",
      "com.android.simappdialog",
      "com.nuts.extremspeedup",
      "com.android.internal.display.cutout.emulation.tall",
      "com.android.certinstaller",
      "com.android.theme.color.black",
      "com.google.android.marvin.talkback",
      "com.android.theme.color.green",
      "com.android.theme.color.ocean",
      "com.android.theme.color.space",
      "com.android.internal.systemui.navbar.threebutton",
      "com.google.android.apps.work.oobconfig",
      "com.qti.qualcomm.datastatusnotification",
      "com.android.hotwordenrollment.xgoogle",
      "com.google.android.pixel.setupwizard",
      "com.android.theme.icon_pack.rounded.launcher",
      "com.google.android.grilservice",
      "com.android.egg",
      "com.android.mtp",
      "com.android.nfc",
      "com.android.ons",
      "com.android.stk",
      "com.android.backupconfirm",
      "com.android.theme.font.arvolato",
      "com.android.systemui.auto_generated_rro_vendor__",
      "com.google.android.deskclock",
      "com.android.statementservice",
      "com.android.hotspot2",
      "com.google.android.as",
      "com.google.android.gm",
      "com.google.android.carrier",
      "com.google.android.apps.tachyon",
      "com.android.sdm.plugins.sprintdm",
      "com.android.internal.systemui.navbar.gestural_extra_wide_back",
      "com.google.android.permissioncontroller",
      "com.google.intelligence.sense",
      "com.google.android.setupwizard",
      "com.qualcomm.qcrilmsgtunnel",
      "com.android.providers.settings",
      "com.android.sharedstoragebackup",
      "com.verizon.services",
      "com.android.nfc.auto_generated_rro_product__",
      "com.google.android.euicc",
      "com.google.android.music",
      "com.android.printspooler",
      "com.android.hotwordenrollment.okgoogle",
      "com.android.sdm.plugins.diagmon",
      "com.android.theme.icon_pack.filled.settings",
      "com.android.dreams.basic",
      "com.android.providers.settings.auto_generated_rro_product__",
      "com.android.se",
      "com.android.inputdevices",
      "com.google.android.apps.wellbeing",
      "com.google.android.dialer",
      "com.google.android.dialer",
      "com.android.bips",
      "com.google.audio.hearing.visualization.accessibility.scribe"
    ]
  }

eyes sources > assets > web > url.html 내 내부 연결 사이트 존재

화상공증 요청 시도 시 해당 피싱 사이트로 리다이렉트

(국가별 최상위 도메인(국가 코드)가 CC: 코코스 제도)

<script>
//alert("화상공증 요청을 신청햇습니다 .\n 잠시만 대기해 주시면 영상요청이  들어옵니다.")
window.location.href = "http://nimabi7.gnway.cc/seoul/kics/login.html";

 

내부 secret-classes.dex 파일 내 악성 코드 존재, 복호화하는 과정 관련 키 값이 포함되지 않아 정적 분석 불가

 

eyes apk > AndroidManifest.xml 파일: 악성 앱이 요구하는 권한

(네트워크 연결 상태 정보, foreground 서비스, 휴대전화 번호, 앱 설치/삭제 권한 등)


두번째 파일, ibk apk 분석

내부 rmDDnx.apk, tefwMF.apk 파일 존재

해당 apk 파일 우클릭하여 Open In > File Path (Ctrl + Alt + F12)

내부 파일 구조 비교

assets 내 mp3 파일: 상담센터 ARS 음성 파일(금감원, 우리은행, 신한은행, SBI저축은행, NH농협 캐피탈 등)

 

AndroidManifest.xml 파일 내부에, 악성 앱이 요구하는 권한은 eyes apk 파일과 유사하며

초기 접근 시 사용자 계정 컨트롤 설정(디바이스를 변경할 수 있도록 허용할지)에 해당하는 권한이 포함된 정보들 존재)

 

728x90
728x90
728x90
반응형
목차
1. Easy ELF 실습
  - 실습을 위한 사전 단계(Linux 파일 실행)
2. 분기문 분석
3. byte 및 배열 정리
4. 소스코드 작성(어셈블리어 기반)

[Review] (4주차) 이론 - 총정리

2022.07.19 - [Security & Analysis/IDA Pro] - [IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

 

[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

개요 * Easy_KeygenMe.exe 파일 실습 1. 레지스터 활용 분석 - 메모리 주소 및 스택 프레임의 이해 - ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리 2. 어셈블리 명령어 이해 및 알고리즘 분석 - Pse

sarahee.tistory.com


1. Easy ELF 실습

ELF 파일은 리눅스의 실행파일이므로, 실행시킨 후 랜덤 문자를 입력

Wrong 출력

파일 확장자를 모든 파일(All Files (*))로 변경

2. 분기문 분석

실행 후 View > Open subviews > Strings (or Shift + F12)

문자열 검색

리눅스 실행 시 조회된 문자열(Reversing.Kr Easy ELF, Wrong) 및 정답 출력 예상(Correct) 조회

Wrong 해당 그래프 모드 확인

Wrong graph

cmp를 통해 분기문 이동

jump if not zero(not equal) → eax가 1이라면(빨간색 화살표), Correct 연결

레지스터나 메모리 값을 변경하지 않고, 플래그 레지스터에만 영향을 줌

* flag register: 상태 레지스터

Correct graph

분기문 지나기 전 call 링크 두개

sub_8048434

sub_8048451

eax가 1이 되기 위해서는, 모든 분기문에서 조건 점프(초록색 화살표 이동)하여, 우측 하단으로 차례 이동

3. byte 및 배열 정리

첫 번째 조건문

byte_804A021의 값과 31h 비교

 

두 번째 조건문

byte_804A020을 eax에 저장하여,

첫 번째 문자(eax 내)와 0x34 XOR 연산

 

세 번째 문자(byte_804A022)와 0x32 XOR 연산

네 번째 문자(byte_804A023)와 0x0FFFFFF88 XOR 연산

다섯 번째 문자(byte_804A024)와 0x58 값이 같은지 비교

 

네 번째 조건문

테스트

 

네 번째 조건문

세번째 문자(byte_804A022)와 0x7C 비교

 

다섯 번째 조건문

첫번째 문자(byte_804A020)와 0x78 비교

 

여섯 번째 조건문

네번째 문자(byte_804A023)와 0x0DD 비교

No. CODE XREF 어셈블리어 10진수 to 문자(ASCII) 순서
1 sub_804851B+2A↓p cmp     al, 31h 0x31 = 49, chr(49) = 1 byte_804A021
2 sub_8048451+C↑j
loc_8048469
xor     eax, 34h
xor     eax, 32h
xor     eax, 0FFFFFF88h
cmp     al, 58h
0x34 = 52, chr(52) = 4
0x32 = 50, chr(50) = 2
0x88 = 136, chr(136) = (enter)
0x58 = 88, chr(88) = X
byte_804A020
byte_804A022
byte_804A023
byte_804A024
3 sub_8048451+4E↑j
loc_80484A8
test     al, al    
4 sub_8048451+60↑j
loc_80484BA
cmp     al, 7Ch 0x7C = 124, chr(124) = | byte_804A022
5 sub_8048451+72↑j
loc_80484CC
cmp     al, 78h 0x78 = 120, chr(120) = x byte_804A020
6 sub_8048451+84↑j
loc_80484DE
cmp     al, 0DDh 0xDD = 221, chr(221) = Ý byte_804A023

 

정리해보면, input 문자열은 다음과 같이 구성 (^: XOR)

input[0] ^ 34h = 78h

input[1] = 31h

input[2] ^ 32h = 7Ch

input[3] ^ 88h = DDh (byte이므로 88 앞의 FFFFFF는 무시)

input[4] = 58h

input[5]는 test(세 번째 조건문)

4. 소스코드 작성(어셈블리어 기반)

// string
ans = ""

ans += chr(0x34 ^ 0x78)
ans += chr(0x31)
ans += chr(0x32 ^ 0x7C)
ans += chr(0x88 ^ 0xDD)
ans += chr(0x58)

print(ans)

 

출력: L1NUX

Correct! 정답 출력

 

 

728x90
728x90
728x90
반응형

NTP

개념 Network Time Protocol, 가장 오래된 인터넷 프로토콜, 네트워크를 통해 컴퓨터 간 시간 동기화를 위한 네트워크 프로토콜
사용 포트 123/UDP port, CVE-2013-5211
원리 NTP 프로토콜에 '몬리스트(monlist)'라는 명령어를 보냄
'monlist'라는 명령으로 요청받으면, 최근에 해당 서버에 접속한 최대 600개의 호스트들에 대한 최신 정보를 응답으로 보내줌
기본 monlist 요청은 8byte로 가능, 수백~수천 배의 응답
찾는 방법 nmap 등의 스캐닝 툴
예시 프랑스에서 초당 400Gbps 규모의 DDoS 공격 탐지(2014년 2월 13일)
NTP 프로토콜을 이용한 증폭 공격 사례
대량의 정보를 요청하는 명령 전송하여 대량의 응답 받음
해결 방안 NTP 서버가 취약한 버전일 경우 NTP-4.2.7p26 이상 버전으로 업그레이드

Intro

NTP에 대해 이해하고 서버 구축하기

 

서버의 설정

1. NTP 서버 설치

2. 파일 설정(/etc/ntp.conf 변경)

3. 방화벽 허용 및 서비스 시작

 

클라이언트 설정

1. NTP 서버 상태 확인(ntpq -p)

2. NTP 서버 시간 동기화(ntpdate 서버 IP주소 명령)

 

NTP 서버 설정

NTP server: 192.168.17.134

NTP client: 192.168.17.145

 

NTP DRDoS Attack 기본 원리

공격자가 자신의 IP를 희생자 IP(client IP)로 바꿔서 NTP에게 시간을 질의

NTP는 클라이언트에게 시간을 알려줌

해커가 클라이언트 IP로 NTP에게 monlist를 요청

클라이언트에게 600개의 정보가 날라감

 

yum: Yellowdog Updater Modified, rpm 기반의 시스템을 위한 자동 업데이트 및 패키지 설치/삭제 도구

sudo apt-get install yum

 

1. 서버 및 클라이언트에 NTP 설치

# yum -y install ntp 혹은

apt install -y ntp

2. NTP 서버 설정

root@ubuntu:/etc# vi ntp.conf

# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift

# Leap seconds definition provided by tzdata
leapfile /usr/share/zoneinfo/leap-seconds.list

# Enable this if you want statistics to be logged.
#statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

# Specify one or more NTP servers.

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See 
http://www.pool.ntp.org/join.html
 for
# more information.
pool 0.ubuntu.pool.ntp.org iburst
pool 1.ubuntu.pool.ntp.org iburst
pool 2.ubuntu.pool.ntp.org iburst
pool 3.ubuntu.pool.ntp.org iburst

# Use Ubuntu's ntp server as a fallback.
pool ntp.ubuntu.com

# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details.  The web page <
http://support.ntp.org/bin/view/Support/AccessRestrictions>

# might also be helpful.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.

# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

# Needed for adding pool entries
restrict source notrap nomodify noquery

# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
#restrict 192.168.123.0 mask 255.255.255.0 notrust


# If you want to provide time to your local subnet, change the next line.
# (Again, the address is an example only.)
#broadcast 192.168.123.255

# If you want to listen to time broadcasts on your local subnet, de-comment the
# next lines.  Please do this only if you trust everybody on the network!
#disable auth
#broadcastclient

 

해당 부분 주석 처리하여 설정 변경

# restrict -4 default kod notrap nomodify nopeer noquery limited
# restrict -6 default kod notrap nomodify nopeer noquery limited

 

192.168.17.0/16 네트워크에서의 NTP 요청 허용

restrict 192.168.17.0 mask 255.255.255.0 nomodify notrap

service ntp restart

 

Kali에서 ntp-monlist scan 시 다음과 같이 filtered

서버 iptables 기본 설정(NTP port: 123/UDP)

iptables -I INPUT 1 -p udp --dport 123 -j ACCEPT

script output


참고 자료

NTP 서버 구축 및 관리

NTP DrDoS Attack

NTP 증폭 공격

 

728x90
728x90
728x90
반응형
개요
* Easy_KeygenMe.exe 파일 실습
1. 레지스터 활용 분석
- 메모리 주소 및 스택 프레임의 이해
- ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리
2. 어셈블리 명령어 이해 및 알고리즘 분석
- Pseudo code 기반 소스코드 작성

목차
0. 파일 버전 확인(32bit, 64bit)
1. 정의된 데이터(db)
2. 어셈블리어: CMP, LEA, TEST, XOR, MOV, MOVZX, MOVSX
3. 메모리의 구조
   1) 코드 영역
   2) 데이터 영역
   3) 힙 영역
   4) 스택 영역 - 레지스터: ESP, EBP, EIP, ECX, EAX

4. IDA 메모리 주소 표시 차이

[Review] (3주차) 실습

2022.07.04 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe) (1)

개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com


0. 파일 버전 확인(32bit,  64bit)

실행파일 32bit, 64bit 버전 확인(e.g. exe, dll, ocx)

ExeProperties 프로그램: 윈도우 탐색기에 플러그인, 실행파일이나 프로그램 내부적으로 사용하는 라이브러리(dll, ocx 등)가 사용하는 비트 확인

Download ExeProperties

 

Download ExeProperties

<!--   ExtraBit Software Ltd. Products | Contact --> ExtraBit Software Home ExeProperties Download Download ExeProperties Download the ExeProperties installer for Windows 11/10/8/7 Download ExeProperties v1.4 To install ExeProperties on your system, run t

www.extrabit.com

설치 이후, 해당 파일 우클릭 > 속성(R) > Exe/Dll Info 탭 추가되어, Additional Exe/Dll Properties 확인 가능

Type: x86 (32-bit) or x64 (64-bit)

기본 속성(Alt+Enter)
Download ExeProperties v1.4
32-bit 확인


1. 정의된 데이터(db)

# define 식별자 문자열

  • 식별자: 매개변수, 전달인자, ...
  • 문자열: 치환텍스트

2. 어셈블리어: CMP, LEA, TEST, XOR, MOV, MOVZX, MOVSX

CMP

cmp [esp+68h+var_63], 61h: esp+68h+var_63의 값이 61h 위치에 있는 값과 같은지 비교(값을 빼서 비교)

LEA

lea edi, [esp+68h+var_63]: esp+68h+var_63에 저장된 주소를 esp에 저장

TEST

: 인수1과 인수2 내용을 AND 연산하여 결과가 0이면 ZF = 1로 설정(보통 NULL check할 때 사용)

(두 operand가 0이 아닌 경우를 제외하고는 값을 판별하기 어려움 → eax, eax와 같은 형태로 사용하여 0인지 아닌지 확인)

Byte 단위로 각각 스택에 넣어줌, 사용자가 입력한 문자열을 첫번째 글자부터 순서대로 Byte 단위로 레지스터에 넣음

XOR

두 입력 신호가 서로 같으면 0, 다르면 1, 동일한 두 값 → 초기화

MOV

데이터 복사 명령어

MOVZX

소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 0 padding

(목적지에 32bit register → 소스에 16bit register)

MOVSX

소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 소스의 맨 처음 bit로 채움

(목적지에 32bit register → 소스에 16bit register)


3.  메모리의 구조

1) 코드(code) 영역

const int constval = 30;  // 상수

int function() {  // 함수
    return 20;
}

실행할 프로그램의 코드가 저장되는 영역 (= 텍스트 영역)

2) 데이터(data) 영역

int uniintial;  // 초기화되지 않은 전역변수
int initial = 30;  // 초기화된 전역변수
static int staticval = 70;  // 정적변수

프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역

프로그램 시작 시 할당, 프로그램 종료 시 소멸

3) 힙(heap) 영역

int main(int argc, const char * argv[]) {
    char *arr = malloc(sizeof(char) * 10);  // 동적 할당 변수
    return 0;
}

사용자가 직접 관리하는 메모리 영역

사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨

메모리의 낮은 주소에서 높은 주소로의 방향으로 할당

4) 스택(stack) 영역

int main(int argc, const char * argv[]) {
    int localval1 = 30;  // 지역변수 1
    int localval2;  // 지역변수 2
    return 0;
}

지역 변수와 매개변수가 저장되는 영역(함수의 호출과 관련)

함수의 호출과 함께 할당, 함수의 호출이 완료되면 소멸

스택 영역에 저장되는 함수의 호출 정보: 스택 프레임(stack frame)

 

스택에 할당된 메모리 블록, 호출된 함수에 지정

함수가 호출되면,

1) 함수 호출자가 파라미터 형태로 정보를 넘겨줄 때 어딘가에 저장되고, 호출된 함수가 정보를 찾게 해야 한다.

2) 함수의 작업을 위한 임시 저장소가 필요하다.

* 스택: 제한적으로 접근할 수 있는 자료 구조(LIFO, Last In First Out)

* 임시 저장소: 주로 지역 변수가 사용, 함수가 종료되면 더 이상 접근 불가

전역변수가 저장되는 곳이 스택이라는  메모리 공간

먼저 선언된 변수일수록  높은 주소값을 할당 받음

→ ESP, EBP는 이러한 스택 공간의 주소값을 저장하기 위해 설계된 레지스터


레지스터: ESP, EBP, EIP, ECX, EAX

* E: Extended(16bit → 32bit system), 64bit에서는 R로 표현

ESP(Stack Pointer)

: 현재의 스택 지점(stack의 가장 아래 부분), 스택의 크기를 조정할 때 사용

  • 현재 스택의 최상단 주소값(가장 작은값) 저장(∵ 스택의 주소는 높은 주소에서 낮은 주소로 할당)
  • 스택에 값을 넣을 때마다 ESP가 4만큼 줄어듦

EBP(Base Pointer)  (= Frame Pointer)

: 프레임 포인터를 사용하는 함수를 가리킴(함수가 프레임 포인터를 쓰는지 여부의 분석이 필요할 때, 이 속성을 이용해 수작업으로 지정 가능 - 레지스터의 크기 보정 필요)

  • 현재 스택 프레임의 베이스 주소(스택의 가장 윗 부분)
  • 스택 프레임(함수나 지역변수의 경계를 구분짓기 위한 하나의 블록으로 묶임)의 base 주소
  • 스택 프레임 형태로 저장된 함수의 지역 변수나 전달인자를 참조/변경시 사용하는 레지스터
  • 고정적, 코드 유지에 용이(스택프레임 생성시)

EIP(instruction pointer)

: 다음에 실행할 명령어 위치를 담는 레지스터

ECX(Extended Counter Register)

: 주로 반복 명령어 사용시 반복 카운터로 사용

EAX(Extended Accum ulator Register)

: 산술(덧셈, 곱셈, 나눗셈 등) 논리 연산을 수행할 때 사용, 함수의 반환값이 이 레지스터에 저장


4. IDA 메모리 주소 표시 차이

var_(숫자): 함수의 지역변수, EBP보다 더 낮은 메모리 주소에 위치하므로 음수 값을 가짐

스택 메모리 구조 상 지정된 주소는 초기 스택 포인터보다 낮은 주소에 있어야 하므로, 스택 포인터가 양수 값을 가지면 에러

디버거 메모리 주소 형태 비고
Ollydbg ESP + n 일반적인 형태
IDA Pro ESP + 현재 스택 포인터 + var_? 자동으로 스택의 사용을 조사해서 지역 변수를 찾아내는데 용이하도록 설정

IDA 디스어셈블러 화면 시작 부분의 var_? 형태로 특정 값이 설정되어 있음

함수 시작 시 EBP 주소를 기준으로 스택 상에 변수가 위치하는 오프셋 값

단축키

1) (지역 변수 선택 후) + x

해당 지역 변수가 또 다른 어디에서 참조되었는지 확인 가능

2) (지역 변수 선택 후) + Enter

"Stack of ..." 창 조회, 해당 함수에서 추측된 스택 프레임 보여줌


[Next] (5주차) 실습

2022.08.06 - [Security & Analysis/IDA Pro] - [IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)

 

[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)

목차 1. Easy ELF 실습 - 실습을 위한 사전 단계(Linux 파일 실행) 2. 분기문 분석 3. byte 및 배열 정리 4. 소스코드 작성(어셈블리어 기반) [Review] (4주차) 이론 - 총정리 2022.07.19 - [Security & Analysis/..

sarahee.tistory.com

 

728x90
728x90
728x90
반응형

DRDoS 개념

Distributed Reflection Denial of Service (분산 반사 서비스 거부 공격)

 

특징

출발지 IP를 위조(Source IP Spoofing)

공격자는 IP를 공격 대상으로 Spoofing, 대량의 공격 요청을 반사 대상(서버 등)에 보냄

→ IP를 기반으로 공격을 방어하거나 공격자 역추적이 어려움

다수의 정상 동작 서버에 공격 트래픽 발생시켜, 정상 트래픽과의 구분이 어려움

공격 트래픽이 수백 Gbps 이상의 대규모로 발생하여, 탐지 하더라도 방어하기 어려움


UDP 기반 증폭 공격

DNS

개념 Domain Name System, 호스트와 도메인 이름과 아이피 주소와의 변환을 수행할 수 있도록 만들어진 주소 변환 프로토콜
사용 포트 53/UDP port, CVE-2006-0987
원리 DNS 레코드 값을 서버에 재귀적인 방식으로 질의를 하여 찾을 수 있음
DNS 서버에 dig 명령을 이용해 ANY 타입의 쿼리로 질의를 보냄(취약한 서버 찾기)
DNS 서버는 질의를 받은 도메인과 관련된 모든 타입의 레코드 정보를 보내줌(대량의 응답)
* dig 명령: DNS 질의응답이 정상적으로 이루어지는지를 확인 점검하는 경우에 주로 사용

기존 DNS 프로토콜: 512byte로 사이즈 제한
확장 버전인 EDNS: 4096byte까지 전송이 가능하여 더 큰 증폭 효과를 만들 수 있음
찾는 방법 DNS 서버에 dig 명령을 이용해 ANY 타입의 쿼리를 보내 취약한 서버 찾음

 

NTP

개념 Network Time Protocol, 가장 오래된 인터넷 프로토콜, 네트워크를 통해 컴퓨터 간 시간 동기화를 위한 네트워크 프로토콜
사용 포트 123/UDP port, CVE-2013-5211
원리 NTP 프로토콜에 '몬리스트(monlist)'라는 명령어를 보냄
'monlist'라는 명령으로 요청받으면, 최근에 해당 서버에 접속한 최대 600개의 호스트들에 대한 최신 정보를 응답으로 보내줌
기본 monlist 요청은 8byte로 가능, 수백~수천 배의 응답
찾는 방법 nmap 등의 스캐닝 툴
예시 프랑스에서 초당 400Gbps 규모의 DDoS 공격 탐지(2014년 2월 13일)
NTP 프로토콜을 이용한 증폭 공격 사례
대량의 정보를 요청하는 명령 전송하여 대량의 응답 받음
해결 방안 NTP 서버가 취약한 버전일 경우 NTP-4.2.7p26 이상 버전으로 업그레이드

 

SSDP

개념 Simple Service Discovery Protocol, UPnP(Universal Plug and Play) 프로토콜에서 근거리 혹은 인터넷에 연결된 디바이스를 찾는데 사용되는 프로토콜
사용 포트 1900/UDP port
원리 SSDP를 이용해 네트워크 서버나 정적인 호스트 설정 없이 디바이스 탐지가 가능(like DHCP, DNS)
M-Search 메서드를 이용하여 멀티캐스트 방식으로 로컬 네트워크에 연결된 디바이스 조회 가능
응답 패킷에는 다양한 정보 포함(e.g. 헤더, 배너정보 OS, UUID 정보)
40byte 정도의 M-Search 요청에 대해 서버는 평균적으로 30배 이상의 크기를 갖는 응답을 보내줌
찾는 방법 UDP 1900번 포트로 SSDP M-Search 패킷으로 인터넷 스캐닝하여 서버 찾음

 

SNMP

개념 Simple Network Management Protocol, 네트워크 디바이스를 관리하는 목적으로 만들어진 프로토콜, 네트워크 구성/성능/장비/보안관리가 가능
기존: 네트워크 디바이스의 모니터링은 ICMP와 같은 프로토콜을 사용
신규: 네트워크가 복잡해짐에 따라 더 효율적으로 네트워크 디바이스를 관리하기 위함
대량의 트래픽을 유발하는 명령 전송하여 대량의 응답 받음
사용 포트 161/UDP port
원리 장비 관리에 접근제어는 SNMP 패킷의 community 필드의 값으로, 보통 public과 같은 값으로 세팅
GetBulkRequest 명령을 이용
테이블에 있는 객체데이터를 요청하는 GetBulkRequest 명령을 반복적으로 수행
70byte의 GetBulkRequest 요청으로 최대 수만 byte의 응답을 받음
찾는 방법 community 값을 public으로 SNMP 패킷을 생성하여 스캐닝하여 증폭 공격에 이용 가능한 서버 찾음

 

Chargen

개념 Character Generator Protocol, 클라이언트의 요청에 대해 랜덤한 개수(0-512)의 문자열을 응답으로 보내주는 프로토콜
사용 포트 19/UDP port (네트워크 연결에 대한 디버깅, 대역폭 테스팅 등에 사용)
원리 60byte의 요청 패킷에 대해 랜덤한(74~1472bytes) 크기의 응답을 보내줌
(수백 배 정도의 증폭 효과)
찾는 방법 nmap 등의 스캐닝 툴

 

Others

NetBios

PC의 이름 등록(name registration)과 resolution을 수행하는 프로토콜의 디버깅을 위한 nbtstat 명령 이용

약 3배 정도의 증폭 효과

 

QOTD

Quote Of The Day, CharGen 프로토콜과 거의 유사한 형태

17/UDP port

 

TCP SYN Flooding

공격자가 IP를 목표물로 설정

반사 서버로 Syn 요청

반사 서버는 목표물에게 SYN+ACK 보냄

일정 시간 이후 목표물이 SYN+ANK 재전송(TCP 연결 특성상)

 

P2P


프로토콜별 증폭 공격이 가능한 이유, 공격 기법

공격자는 보통 네트워크 스캐너를 이용하여 증폭 공격에 이용할 취약 서버 리스트를 확보

(e.g. 디바이스 검색엔진 Shodan 이용)

 

과정

증폭 공격에 대한 공격 대상이 네트워크에 존재하는 경우

공격에 사용되는 서버가 네트워크에 존재하는 경우

공격자가 네트워크에 존재하는 경우

 

보안 대책

ISP에서 IP Spoofing 패킷 진입 불가(Ingress Filtering) 설정

네트워크 보안 장비(e.g. 방화벽)에서 동일 IP에 대해 일정 요청 이상은 차단하도록 설정

NTP의 경우 monlist 기능 비활성화(ntpdc -c monlist (NTP server add))

 

Proactive Attack Prevention

사전에 DRDoS 증폭 공격을 방어하는 방법

1) IP spoofing을 원천적으로 막는 안티스푸핑(Anti spoofing) 기법 적용

2) 프로토콜 취약점을 패치

 

1. 안티 스푸핑(Anti-Spoofing)

: 인증을 이용한 안티 스푸핑 기법

1) 세션 토큰을 이용한 인증

2) 암호화 기법을 이용한 인증

3) 제삼자(third-party)를 이용한 인증

성능 상의 오버헤드나 추가적으로 트래픽 발생

 

2. 네트워크 토폴로지를 이용한 방법

 


[참조]

 

최현상,박현도,이희조, "DRDoS 증폭 공격 기법과 방어 기술 연구(A Study on Amplification DRDoS Attacks and Defenses)", 한국정보전자통신기술학회논문지, 15-08-05-429 Vol.8 No.5 (2015), 9page.

 

김효종, 한군희, 신승수, "DRDoS 증폭 공격 대응 시스템(Response System for DRDoS Amplification Attacks)", 융합정보논문지(Journal of Convergence for Information Technology), Vol.10 No12 (2020), 22~30page

 

 

728x90
728x90
728x90
반응형
개요
* Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습
1. 디스어셈블리 상세 기능
- 스택 프레임 및 함수 호출 규약의 이해
- 동적 디버깅 사용 및 코드 실행
- 데이터 타입과 데이터 구조
- 기본 데이터/코드 변환
2. 스택/힙 할당 배열 및 구조체 접근

목차
0. Easy KeygenMe 실습
1. 어셈블리어: MOV, CMP, XOR, MOVZX, MOVSX
2. 알고리즘 분석
3. XOR(⊕) 연산의 결합법칙
4. 소스코드 작성(pseudo code 기반)

[Review] (3주차) 실습

2022.07.04 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe) (2)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe) (2)

개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com


0. Easy KeygenMe 실습

Intro

Find the Name when the Serial is 5B134977135E7D13

Name을 사용해서 시리얼 값 생성, 역으로 시리얼 값을 통해 해당 Name을 찾아내는 문제

초기 디스어셈블리 창
debug Running page
Input Name, Input Serial

시리얼 생성 알고리즘과 관련된 문제 풀이

1) 어셈블리어로 전체적인 구조 파악

2) Hex-rays로 세부 알고리즘 파악

rep stosd: 저장소 문자열 명령

stosb: AL로부터 byte를 읽어 들임, stosw: AX로부터 word를 읽어 들임 - 정수값을 메모리에 복사


1. 어셈블리어: MOV, CMP, XOR, MOVZX, MOVSX

MOV

데이터 복사 명령어

0x10: [esp+140h+var_130]

0x20: [esp+140h+var_12F]

0x30: [esp+140h+var_12E]

Byte 단위로 각각 스택에 넣어줌, 사용자가 입력한 문자열을 첫번째 글자부터 순서대로 Byte 단위로 레지스터에 넣음

CMP

esi가 3 이상이면 0으로 초기화

XOR

두 입력 신호가 서로 같으면 0, 다르면 1, 동일한 두 값초기화

MOVZX

소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 0 padding

(목적지에 32bit register 소스에 16bit register) 

MOVSX

소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 소스의 맨 처음 bit로 채움

(목적지에 32bit register → 소스에 16bit register)

loc_40107E: pseudocode


2. 알고리즘 분석

1) v3이 v8의 strlen이 클 때 까지 반복하고, i가 3 이상이면 0으로 초기화

2) sprintf를 통해 Buffer에 생성된 serial 저장

3) "%s%02X"를 통해 기존 Buffer 내용과 v8 포인터 입력값을 한글자씩 가져옴

4) xor 연산을 한 값을 sprintf 함수를 통해 serial이 저장되는 Buffer에 저장

5) serial을 계산하여 scanf로 입력받은 후, strcmp 함수로 동일한지 비교

- if 0일 때 거짓, 0이 아닐 때 참으로 동작하므로, strcmp 내 0일 경우(문자열이 같을 경우) Correct 출력

 

v6에는 16 16 = 0x10

v7[i - 1]가 될 수 있는 값은, v7[0], v7[1], v7[2]의 반복

qmemcpy: sizeof(v7)만큼 " 0" 영역의 값을 v7로 복사

첫번째 인자(v7): 복사받을 메모리를 가리킴

두번째 인자(" 0"): 복사할 메모리를 가리킴

세번째 인자(sizeof(v7)): 복사할 데이터(값)의 길이(바이트 단위)

 

16진수이므로 두자리씩 끊어서 총 8자리


3. XOR(⊕) 연산의 결합법칙

^: XOR 연산자

p q p ⊕ q (p ⊕ q) ⊕ q
T T F T
T F T T
F T T F
F F F F

(p ⊕ q) ⊕ q ≡ p ⊕ (q ⊕ q) ≡ p ⊕ F ≡ p

 

0x5b^0x10

0x13^0x20

0x49^0x30

0x77^0x10

0x13^0x20

0x5E^0x30

0x7D^0x10

0x13^0x20


4. 소스코드 작성(pseudo code 기반)

# sol1

serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
ans = []

i_xor = 0
for i_ser in range(len(serial)):
    if i_xor >= 3:
        i_xor = 0
    ans.append(serial[i_ser]^xor[i_xor])
    i_xor += 1
    print(chr(ans[i_ser]), end='')

# sol2

serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
ans = []

for i in range(len(serial)):
    ans.append(serial[i]^xor[i%3])
    print(chr(ans[i]), end='')

출력: K3yg3nm3

75 51 121 103 51 110 109 51

Name: K3yg3nm3 / Serial: 5B134977135E7D13

결과값 출력도 전에 창이 닫혀서, cmd로 다시..

Correct!


[Next] (4주차) 이론

2022.07.19 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

 

IDA Pro 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

개요 * Easy_KeygenMe.exe 파일 실습 1. 레지스터 활용 분석 - 메모리 주소 및 스택 프레임의 이해 - ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리 2. 어셈블리 명령어 이해 및 알고리즘 분석 - Pse

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
개요
* Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습
1. 디스어셈블리 상세 기능
- 스택 프레임 및 함수 호출 규약의 이해
- 동적 디버깅 사용 및 코드 실행
- 데이터 타입과 데이터 구조
- 기본 데이터/코드 변환
2. 스택/힙 할당 배열 및 구조체 접근

목차
0. Easy CrackMe 실습 이어서
1. 스택 프레임(stack frame)이란?
2. 레지스터: ESP, EBP, EIP, ECX, EAX
3. 어셈블리어: CMP, LEA, TEST
4. Debugger

[Review] (2주차) 실습 - Easy CrackMe (1)

2022.06.12 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

목차 - 샘플 파일을 이용하여 IDA Pro 실행 - 사용자 인터페이스 및 기본 사용법 이해 * 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요) 0. IDA Pro란? 1. 실행 파일 로드 2. 디스어셈..

sarahee.tistory.com


0. Easy CrackMe 실습 이어서

Easy_CrackMe.exe 실행시 팝업창
임의의 값을 넣어 확인 버튼 눌렀을 때 Incorrect Password
Alt + T: Enter the search substring(문자열 및 어셈블리어 검색) > Tab: Ctrl + T
MessageBoxA 함수 영역

  • 성공 시의 메시지 출력(Congratulation !!)
  • 실패 시의 메시지 출력(Incorrect Password)

input이 틀렸을 경우 MessageBox로 JMP하게 만드는 분기문 확인

.text:004010B0                 cmp     [esp+68h+var_63], 61h ; 'a'

.text:004010BD                 push    offset Str2     ; "5y"

.text:004010D1                 mov     esi, offset aR3versing ; "R3versing"

.text:0040110D                 cmp     [esp+68h+String], 45h ; 'E'

strcmp: 문자열 비교 함수

strncmp: strcmp + n(검사할 문자의 개수 지정)

형태: char * strncmp( const char *s1, const char *s2, size_t n);

ASCII Table(10진 - 16진 - 문자 변환): 97 - 0x61 - a, 69 - 0x45 - E
ASCII Table
Str2 = 5y, aR3versing = R3versing


1. 스택 프레임(stack frame)이란?

스택에 할당된 메모리 블록, 호출된 함수에 지정

함수가 호출되면,

1) 함수 호출자가 파라미터 형태로 정보를 넘겨줄 때 어딘가에 저장되고, 호출된 함수가 정보를 찾게 해야 한다.

2) 함수의 작업을 위한 임시 저장소가 필요하다.

* 스택: 제한적으로 접근할 수 있는 자료 구조(LIFO, Last In First Out)

* 임시 저장소: 주로 지역 변수가 사용, 함수가 종료되면 더 이상 접근 불가


2. 레지스터: ESP, EBP, EIP, ECX, EAX

예제

32비트 x86 기반 컴퓨터의 컴파일된 함수 코드

void bar(int j, int k); // 호출할 함수
void demo_stackframe(int a, int b, int c) {
	int x;
    char buffer[64];
    int y;
    int z;
    // 스택 프레임 테스트 용도 외에는 다른 목적이 없는 함수
    bar(z, y);
}

지역 변수에 최소 76바이트(3개의 4바이트 정수, 64바이트 버퍼)가 필요

변수 오프셋 ESP 기반 스택 프레임
z [esp] 지역 변수
y [esp+4]
buffer [esp+8]
x [esp+72]
저장된 eip [esp+76]  
a [esp+80] 파라미터
b [esp+84]
c [esp+88]

모든 오프셋은 ESP가 바뀜에 따라 다시 조절

변수 오프셋 EBP 기반 스택 프레임
z [ebp-76] 지역 변수
y [ebp-72]
buffer [ebp-68]
x [ebp-4]
저장된 ebp [ebp] 저장된 레지스터
저장된 eip [ebp+4]  
a [ebp+8] 파라미터
b [ebp+12]
c [ebp+16]

개념 정리

* E: Extended(16bit  32bit system), 64bit에서는 R로 표현

ESP(stack pointer register)

: 현재의 스택 지점(stack의 가장 아래 부분), 스택의 크기를 조정할 때 사용

- 스택에 값을 넣을 때마다 ESP가 4만큼 줄어듦

EBP(base pointer)

: 프레임 포인터를 사용하는 함수를 가리킴(함수가 프레임 포인터를 쓰는지 여부의 분석이 필요할 때, 이 속성을 이용해 수작업으로 지정 가능 - 레지스터의 크기 보정 필요)

- 스택의 가장 윗 부분, 스택 프레임 형태로 저장된 함수의 지역 변수나 전달인자를 참조/변경시 사용하는 레지스터

- 고정적, 코드 유지에 용이(스택프레임 생성시)

EIP(instruction pointer)

: 실행할 명령의 주소


3. 어셈블리어: CMP, LEA, TEST

1) .text:004010B0

.text:004010B0 cmp [esp+68h+var_63], 61h ; 'a'

디스어셈블리 코드 설명
.text:00401080  var_63 스택 프레임에서 바로 참조할 수 있는 모든 변수의 목록을
변수 크기와 프레임 포인터에서 떨어진 거리와 함께 요약해 보여줌
.text:00401080  sub esp, 64h 스택 프레임에 지역 변수를 위한 98바이트(64h 대략 환산) 할당
.text:004010B0  cmp [esp+68h+var_63], 61h dest == source 이면 ZF(Zero Flag) = 1, CF(Carry Flag) = 0

CMP

cmp [esp+68h+var_63], 61h: esp+68h+var_63의 값이 61h 위치에 있는 값과 같은지 비교(값을 빼서 비교)

LEA

lea edi, [esp+68h+var_63]: esp+68h+var_63에 저장된 주소를 esp에 저장

[esp+68h+var_63] 우클릭시 &rarr; [esp+5]

2) .text:004010BD

.text:004010BD push offset Str2 ; "5y"

ECX(Extended Counter Register)

: 주로 반복 명령어 사용시 반복 카운터로 사용

EAX(Extended Accum ulator Register)

: 산술(덧셈, 곱셈, 나눗셈 등) 논리 연산을 수행할 때 사용, 함수의 반환값이 이 레지스터에 저장

TEST

: 인수1과 인수2 내용을 AND 연산하여 결과가 0이면 ZF = 1로 설정(보통 NULL check할 때 사용)

(두 operand가 0이 아닌 경우를 제외하고는 값을 판별하기 어려움 eax, eax와 같은 형태로 사용하여 0인지 아닌지 확인)

[esp+6Ch+Str1] 우클릭시 &rarr; [esp+10]

3) .text:004010D1

.text:004010D1 mov esi, offset aR3versing ; "R3versing"
[esp+70h+var_60] 우클릭시 &rarr; [esp+16]

4) .text:0040110D

.text:0040110D cmp [esp+68h+String], 45h ; 'E'
[esp+68h+String] 우클릭시 &rarr; [esp+4]

주소 해당 문자열 ESP 스택 포인터 10진수 변환 순번
.text:004010B0 a [esp+68h+var_63] [esp+5] 2
.text:004010BD 5y [esp+6Ch+Str1] [esp+10] 3
.text:004010D1 R3versing [esp+70h+var_60] [esp+16] 4
.text:0040110D E [esp+68h+String] [esp+4] 1

참조 순서: E - a - 5y - R3versing


4. Debugger

options: No debugger / Local Bochs debugger / Local Windows debugger / PIN tracer

Remote GDB debugger / Remote Windows debugger / Trace replayer / Windbg debugger

어셈블리 코드 파악을 위한 Local Windows debugger

Start a new process in the debugger or continue a debugged process 클릭시 > Yes
answer: Ea5yR3versing

 


[Next] (4주차) 실습 - Easy KeygenMe

2022.07.04 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe)

개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com

 

728x90
728x90
728x90
반응형

개요

- 샘플 파일을 이용하여 IDA Pro 실행
- 사용자 인터페이스 및 기본 사용법 이해
* 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요)

목차
0. IDA Pro란?
1. 실행 파일 로드
2. 디스어셈블리 윈도우
3. 자주 쓰는 단축키
4. 추가 뷰 조회
5. Easy CrackMe 실습
6. IDA database 종료시 설정
7. 기타 분석 개념 정리

[Review] (1주차) 기본 이론

2022.05.22 - [IDA Pro] - IDA Pro 악성코드 정적 분석 툴 사용법(기본 개념 이론) - week.01

 

IDA Pro 악성코드 정적 분석 툴 사용법(기본 개념 이론) - week.01

목차 1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어 2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블 3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커 4. IDA, Hex-rays 개념 5. 세대별 언어 특징 1

sarahee.tistory.com


실습 진행 과정

1. IDA 파일 정보 확인
- IDA 로딩 파일(.idb), 데이터베이스 파일(.id0, .id1, .nam, .til)
2. IDA 툴 기능의 이해
- IDA 데스크탑/그래프 뷰 등 화면 동작/기능 파악
- 데이터 타입/코드 변환 등 설정 대화상자 기능 파악
- pseudo code 조회, 다른 함수로 변환 등
3. 코드 표기 이해(헥사 뷰, 디스어셈블리 뷰 동기화 등)

 


0. IDA Pro란?

Interactive Disassembler Professional, 핵스레이(Hex-Rays)사에서 배포한 디스어셈블러 도구

상호작용이 가능한 대화형으로 작성됐으며, 디스어셈블러 과정의 모든 부분을 수정, 조작, 재배치, 재정의 가능

- 악성코드 분석, 역공한 엔지니어링, 취약점 분석

분석하고자 하는 대상의 바이너리(파일)가 몇 비트 대상으로 컴파일 되었는지에 따라 결정 (32bit, 64bit)


1. 실행 파일 로드

IDA Pro는 파일 포맷과 프로세서 아키텍처를 인식

1) Load file

Portable executable for 80386 (PE) [pe.dll]: windows 운영체제에서 정의한 파일 포맷, 기본 윈도우 실행 파일로 인식

→ 운영체제 로더가 로딩하는 것처럼 메모리에 파일 매핑

MS-DOS executable (EXE) [dos.dll]: 확장 형태가 PE 파일

Binary file: IDA Pro가 파일을 원본(raw) 바이너리로 디스어셈블, 기본적으로 제공하는 파일 분석 방법

(IDA가 인식하지 못하는 경우 대비, 인식하는 로더가 없는 경우 저수준 분석 작업)

2) Processor type

MetaPC (disassemble all opcodes): 프로세스 모듈

- IDA 로더가 대부분 실행 파일 헤더 분석에 기초하여 알맞은 프로세스 선택

3) Options

Manual load: 파일을 로드하는 새로운 가상 주소를 명시하는 입력 박스를 볼 수 있음

Load file format Architecture
Portable executable for 80386 (PE) [pe.dll] x86 아키텍처, 32bit, RAM 4GB까지 가능(메모리 인식률)
Portable executable for AMD64 (PE) [pe64.dll] x64 아키텍처, 64bit

* PE 파일 포맷 기준

  • PE 파일(Portable Executable): 윈도우용 실행 파일 포맷
  • COFF(Common Object File Format): 유닉스용 공유 라이브러리 포맷
  • ELF(Executable Linking Format): 유닉스용 실행 파일 포맷

IDA 데이터베이스 파일 생성

1) id0: B 트리 형태의 데이터베이스

2) id1: 각 프로그램 바이트를 기술하는 플래그 데이터베이스

3) nam: 네임 창에서 이름 붙인 프로그램 위치의 인덱스 정보 데이터베이스

4) til: 해당 데이터베이스에서 정해준 지역 타입 정의 데이터베이스

* 각 파일의 포맷은 확인 불가(IDA 미제공)


2. 디스어셈블리 윈도우

(참고용) Optional Manual load 체크시 화면

디스어셈블리 윈도우는 두 모드 출력(Space bar로 전환) (그래프 모드 ↔ 텍스트(리스트) 모드)

1) 그래프 모드

플로우 차트 형식으로 단일 함수의 내역 조회, 행 번호/명령어 코드 배제

(면적을 최소한으로 줄이고자) 전반적으로 디스어셈블 코드 라인에 대한 정보가 많이 제외됨

초기 디스어셈블리 창(WinMain) - 바이너리를 조작하고 분석하는 주요 위치(어셈블리 코드 위치)

설정 변경

Options > General 팝업창(IDA Options) > Display disassembly line parts 에서

(1) Line prefixes (graph)

: 위치 찾기에 용이 (e.g. .text:0040131A)

(2) Number of opcode bytes (graph) = 6

: 기본 0으로 설정되어 있으며, 대부분의 명령어는 6바이트 이하이므로 6으로 변경 (e.g. 39 3D 64 85 40 00)

그래프 모드

화살표의 색깔과 방향을 이용하여 프로그램의 흐름을 파악할 수 있음

  • 녹색: 조건 점프(conditional jump)했을 경우(Yes)
  • 빨간색: 조건 점프가 아닐 경우(No)
  • 푸른색: 무조건 점프(unconditional jump)(연속 블록)

2) 텍스트 모드

바이너리 데이터 영역을 볼 때 사용

텍스트 모드

화살표 윈도우(arrows window): 출력 왼쪽, 프로그램의 비선형 흐름(nonlinear flow)를 보여줌

  • 실선: 무조건 점프
  • 점선: 조건 점프
  • (위를 향하는) 굵은 점선 화살표: 반복 구문 암시

 

IDA Pro의 자동 주석 기능

Options > General > ☑ Auto comments

  • sub link: 함수 시작 링크 (e.g. printf, sub_401080)
  • loc link: 목적지(location)로 점프하는 링크 (e.g. loc_401102, loc_4010FE)
  • offset link: 메모리 내의 오프셋 링크 (e.g. push offset Caption)

* offset link: 참조 위치로 점프해 출력할 때 유용, 메모리 내 정의한 위치로 이동

 

Compare Two Operands
Logical Compare
Logical Exclusive OR
Integer Subtraction with Borrow

...

앞으로/뒤로 가기 버튼

앞으로/뒤로 가기 버튼: 작업 내역 이동, 디스어셈블리 윈도우에서 새로운 위치를 탐색할 때마다 작업 내역에 추가

←: Esc / → : Ctrl + Enter

 

IDA Pro 인터페이스는 매우 다양해서, 원 위치로 되돌아오기 거의 불가능함

돌아오려면 Windows > Reset desktop 선택 (레이블 작업은 그대로, 윈도우와 GUI 인터페이스만 기본으로 복구)

저장하려면 Windows > Save desktop 선택

overview navigator, 탐색 밴드(navigation band)

로드한 바이너리 주소 영역을 코드에 따라 선형으로 보여줌

노란색 위치 화살표: 현재의 위치

하늘색: FLIRT로 인식한 라이브러리 코드 (COLLAPSED FUNCTION)

회색: 정의된 데이터

갈색: 정의되지 않은 데이터

분홍색: import, 외부 기호

빨간색: 컴파일러가 생성한 코드

파란색: 사용자가 작성한 코드(악성코드 분석 수행)

* IDA Pro는 FLIRT(Fast Library Identification and Recognition Technology)라 하여,

고속 라이브러리 식별과 인식 기술에 확장된 코드 시그니처를 포함하고 있음

→ 디스어셈블한 함수와 컴파일러가 추가된 라이브러리 코드를 식별해 label 가능


3. 자주 쓰는 단축키

Search > Next Code: 지정한 명령어를 담고 있는 다음 위치 커서로 이동

Search > Text: 전체 디스어셈블리 윈도우에서 특정 문자열 검색

Search > Sequence of Bytes: 특정 바이트 순서로 16진수 보기 윈도우에 있는 바이너리 검색 수행

G: Jump to address

G or Jump > Jump to File Offset 선택

특정 가상 주소로 점프 (e.g. 문자열, 셸코드, sub_401080, printf)

Ctrl + P: Choose function to jump to

Ctrl + P

특정 함수 조회 및 이동

F2: Break Point

F2

debbuging 모드의 break point

Pseudo Code

F5

IDA View에서 변환을 원하는 함수를 클릭한 뒤 F5 → 프로그래밍 변환되어 창 생성

특정 프로그래밍 언어의 문법이 아니라, 일반적인 언어로 코드를 흉내 내어 알고리즘을 써놓은 코드


4. 추가 뷰 조회

헥사 뷰(Hex View)

헥사 뷰(Hex View)

우클릭하여 Synchronize with > IDA View-A 확인

Edit 메뉴: 헥사 에디터 (수정 이후 commit이나 취소하여 view 모드로 돌아옴)

Data Format 메뉴로 표시되는 형식을 n진수 형태로 보여줌

구조체 창(Structures)

구조체 창(Structures)

바이너리에서 사용됐다고 판단된 C 구조체나 공용체 같은 복합 구조체를 보여줌

 

  • 열거 창(Enums): 구조체 창과 유사, IDA가 표준 열거형 데이터 타입을 찾았다면 표시
  • 임포트 창(Imports): 바이너리에서 분석된 임포트된 모든 함수 목록 조회(바이너리가 공유 라이브러리를 사용할 때만 유효함), 정적 링크된 바이너리는 외부 의존도가 없기 때문에 임포트될 사항이 없음
  • 익스포트 창(Exports): 파일의 진입점(entry point) 목록 조회
  • 문자열 창, 네임 창, 세그먼트 창, 시그니처 창, 타입 라이브러리 창, 함수 호출 창, Problems 창, ...

5. Easy CrackMe 실습

Easy_CrackMe.exe 실행시 팝업창
임의의 값을 넣어 확인 버튼 눌렀을 때 Incorrect Password
Quick view: Ctrl + 1 - Names view 선택

Ctrl + 1

Quick view 조회

Alt + T: Enter the search substring(문자열 및 어셈블리어 검색)

Alt + T

문자열 및 어셈블리어 검색

Ctrl + T

방금 팝업창에 조회된 문자열 검색(Tab 기능)

더블클릭하여 해당 함수로 이동

우클릭 > List cross references to... or Ctrl + X

xref, 커서가 가르키는 주소를 참조하는 곳을 조회

함수 확인
Text search 결과 (☑ Find all occurrences)
Alt + T > Congratulation
MessageBoxA 함수 영역

  • 성공 시의 메시지 출력(Congratulation !!)
  • 실패 시의 메시지 출력(Incorrect Password)

  • strcmp: 문자열 비교 함수
  • strncmp: strcmp + n(검사할 문자의 개수 지정)

input이 틀렸을 경우 MessageBox로 JMP하게 만드는 분기문 확인

[text:004010B5, 004010CD, 0040110B, 00401112]

'a' '5y' 'R3versing' 'E'

Ea5yR3versing


6. IDA database 종료시 설정

IDA 데이터베이스 닫기

데이터베이스가 닫혔던 상태 그대로의 환경에서 작업을 시작하게 해줌

IDB 파일 - IDA 데이터베이스 파일

현재 프로젝트 파일을 닫을 때 문제 없다면 압축되어 IDB 파일 생성 (기존 파일이 남아있다면 데이터베이스 손상)

- 가끔 크래시가 발생(e.g. IDA 버그, 설치 플러그인의 문제)


7. 기타 분석 개념 정리

0부 | 악성코드 분석 입문 (p.47~)

악성코드(malware)

일반적인 유형: 바이러스(virus), 트로이 목마(trojan horse), 웜(worm), 루트킷(rootkit), 스케어웨어(scareware), 스파이웨어(spyware)

목표: 네트워크 침입 대응에 필요한 정보를 알아내기 위함, 정확히 무슨 일이 발생했는가? 감염된 시스템과 파일이 무엇인까?

목적: 의심스러운 특정 바이너리가 하는 행위, 네트워크에서 탐지하는 방법, 피해 범위 측정

- 악성코드 분석을 통해 호스트 기반과 네트워크 기반의 시그니처 생성

* 네트워크 시그니처: 네트워크 트래픽 모니터링을 통해 악성 코드를 탐지할 때 사용

악성코드의 유형

1) 백도어(backdoor): 공격자의 접근 허용 목적으로 컴퓨터에 자기 자신을 설치하는 악성코드

2) 봇넷(botnet): 공격자가 시스템에 접속 가능, 동일한 봇넷에 감염된 모든 컴퓨터가 하나의 명령 제어(C&C, Command-and-Control) 서버로부터 동일한 명령어 수신

3) 다운로더(downloader): 다른 악성코드를 다운로드할 목적만으로 존재하는 악성코드

(1) 시스템에 처음 접근 권한을 얻으면 공격자는 다운로더를 설치

(2) 다운로더 프로그램은 추가 악성코드를 다운로드하고 설치

4) 정보 유출 악성코드(information-stealing malware): 피해자의 컴퓨터에서 정보를 수집해서 공격자에게 전송하는 악성코드

- 이메일이나 온라인 뱅킹 같은 온라인 거래에 접근 권한을 얻고자 할 때 사용

(e.g. 스니퍼, 패스워드 해시 수집기, 키로거)

5) 실행기(launcher): 다른 악성 프로그램을 실행할 때 사용하는 악성 프로그램

- 시스템의 상위 권한이나 은폐를 위해 다른 악성 프로그램을 실행할 때 이전 기법과 다른 기법을 사용

6) 루트킷(rootkit): 다른 코드 내에서 자신의 존재를 숨기도록 설계한 악성코드

- 백도어 같은 다른 악성코드를 함께 사용(공격자의 원격 접속 허용과 피해자의 코드 탐지를 어렵게 만들기 위함)

7) 스케어웨어(scareware): 감염된 사용자가 뭔가를 구매하게 겁을 주는 악성코드

8) 스팸 전송 악성코드(spam-sending malware): 사용자의 장비를 감염시켜 스팸을 전송하는 데 이용하는 악성코드

9) 웜/바이러스(worm/virus): 자기 자신을 복제해 추가로 컴퓨터를 감염

 

1부 | 기초 분석 (p.55~)

악성 여부를 판단하는 안티바이러스 도구 사용

악성코드를 판별하는 해시 사용

파일의 문자열, 함수, 헤더에서 개략적인 정보 수집

 

안티바이러스 스캐닝 - 해시:악성코드에 대한 지문 - 문자열 검색

안전한 해시 알고리즘 1(SHA-1, Secure Hash Algorithm)

메시지 다이제스트 알고리즘 5(MD5, Message-Digest Algorithm)

 


[Next] (3주차) 실습 - Easy CrackMe (2)

2022.07.04 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe, Easy_KeygenMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe, Easy_KeygenMe) (1)

목차 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
목차
1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어
2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블
3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커
4. IDA, Hex-rays 개념
5. 세대별 언어 특징

1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어

기계어 - 어셈블리어 - 고급언어

1) 기계어(Machine Language)

개념: CPU가 별다른 해석(컴파일) 없이 읽을 수 있는 프로그래밍 언어(컴퓨터가 사용하는 언어), 프로그램을 나타내는 가장 낮은 단계

예시: 

1000 1011 0100 0101 1111 1000 -> 8b 45 f8

0000 0011 0100 0101 1111 1100 -> 03 45 fc

 

2) 어셈블리어(Assembly Language)

개념: 기계어의 숫자를 사람들이 이해하기 쉽게 만든 언어, CPU의 명령어들을 영어 약자로 표기(기호와 CPU의 명령어가 일대일 대응)

예시: 1000 1011 → MOV (저급 언어)

 

3) 고급 언어(High-Level Language)

개념: 사람들이 이해하기 편하도록 만들어진 프로그래밍 언어(사람의 언어에 가까운지를 표현하는 단어)

특징: 특정한 컴퓨터의 구조나 프로세서와 무관하게, 독립적으로 프로그램을 작성

비교: 프로그래밍 언어의 문법 구조가 기계어와 유사하면 '저급 언어(Low-Level Language)'

예시: 고급 언어(C++, Java, C#), 중급 언어(Middle-Level Language, C)

2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블

  • 어셈블러(assembler): 기호를 이진수로 변환하는 프로그램(어셈블리어 → 기계어)
  • 컴파일러(Compiler): 고급 언어로 작성된 명령어를 기계어로 변경하는 프로그램

어셈블러와 컴파일 작업을 역으로 수행하는 툴: 디스어셈블러와 디컴파일러

  • 디스어셈블러: 어셈블리 과정을 되돌려서 결과물로 어셈블 코드 생성(기계어 → 어셈블리어)
  • 디컴파일러: 어셈블리/기계어(입력) → 고급언어(출력)

전통적인 소프트웨어 개발 모델은 컴파일러, 어셈블러, 링커로 실행 파일을 만든다.

* 링킹(linking): 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드/실행 가능한 한 개의 파일로 만드는 작업

* 링커(linker): 링크 에디터(link editor), 소프트웨어 개발에서 독립적인 컴파일을 가능하게 하는 프로그램

 

컴파일러가 만들어낸 하나 이상의 목적 파일을 가져와 단일 실행 프로그램으로 병합

다시 말해서, 프로그램이나 라이브러리 등 컴파일 이후 연결하는 과정

 

Build Process(C): 전처리기 - 컴파일러 - 어셈블러 - 링커

3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커

gcc program.c
gcc program.c -o program

1) 전처리기(Preprocessor): 전처리기 구문 처리(디렉토리/컴파일러 라이브러리 폴더에서 헤더파일 include, define 값 치환)

gcc -E program.c -o program.i
include <stdio.h>
defind A 10

 

2) 컴파일러(Compiler): 고수준 언어를 저수준 언어(기계어와 가까운)로 나타나는 역할

gcc -S program.i -o program.s
.file   "program.c"
        .section        .rodata
.LC0:
        .string "%d + %d = %d\n"
        .text
        .globl  main
        .type   main, @function
main:

3) 어셈블러(Assembler): 완전히 기계어로 바꿔주는 역할

gcc -c program.s -o program.o
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@È^B^@^@^@^@^@^@^@^@^@^@@^@^@^@^@^@@^@^M^@
^@UH<89>åH<83>ì^PÇEü
^@^@^@ÇEø^T^@^@^@<8b>Eø<8b>Uü^AÐ<89>Eô<8b>Mô<8b>Uø<8b>Eü<89>Æ¿^@^@^@^@¸^@^@^@^@è^@^@^@^@ÉÃ%d + %d = %d

 

4) 링커(Linker): 여러 개의 오브젝트 파일 혹은 라이브러리를 합칠 때 사용

gcc program.o -o program.exe

5) 실행

./program.exe

4. IDA, Hex-rays 개념

IDA(Interactive Disassembler): malware reverse engineering tools

  • IDA Pro: 기본적으로 디스어셈블러(Dis-Assembler)의 속성을 가짐
  • Hex-rays: 디컴파일러(De-Compiler) 플러그인

디스어셈블리란?

disassembly: (명, n)분해, disassemble: (동, v)분해하다

 

디스어셈블리가 필요한 이유: 소스코드가 없을 때 프로그램을 이해하는데 주로 사용

1) 멀웨어 분석

동적 분석(dynamic analysis): 제어할 수 있는 환경하에서(샌드박스) 멀웨어를 실행시켜 가며 여러 가지 시스템 툴을 사용해 행동을 관측하는 것

정적 분석(static analysis): 프로그램 코드를 읽어가며 프로그램의 행동 분석

2) 취약점 분석: 취약점이 있는 프로그램의 소스를 알지 못할 경우 분석이 필요할 때

취약점 발견, 취약점 분석, 개발

프로그램의 잠재적 취약점 발견: 동적분석 퍼징(Fuzzing) 이용

* Fuzzing: 취약점 발견을 위한 기술, 대량의 고유한 입력 값 생성하고 어떤 것이 프로그램의 동작을 문제로 일으키는지 파악/분석/이용

3) 소프트웨어 상호 연동: 상호 연동이 필요한 프로그램의 소스를 알지 못할 경우 분석이 필요할 때

4) 컴파일러 검증: 컴파일러가 생성한 코드가 성능이 제대로 됐는지, 결과물이 제대로 됐는지 검증이 필요할 때

5) 디버깅 디스플레이: 디버깅 중 프로그램의 인스트럭션을 표시하고자 할 때


5. 세대별 언어 특징

1세대 언어

대표: 기계어로 비유됨

특징: 가장 저수준 형태로, 1과 0으로 구성. 16진수(hexa decimal)

2세대 언어

대표: 어셈블리 언어

특징: 니모닉(mnemonic)으로 인해 프로그래머가 연산을 기억하기 쉽게 변화함

* 니모닉: 짧으면서 특징 있는 문자열 (니모닉 코드: 연상 기호 코드, 기계어와 일대일로 대응하는 명령어)

* 어셈블러: 어셈블리 언어 프로그램을 실행 가능한 기계어로 바꿔주는 툴

3세대 언어

대표: fortran, cobol, C, JAVA

특징: 의미 단위로 블록을 묶음, 플랫폼(기계, H/W) 독립적인 형태로 작성

4세대 언어

대표: SQL, Visual C++, Visual Basic

특징: 비절차 언어(절차 언어의 대표는 C), 특정 응용 프로그램과 함께 지원(DB 접근에 이용되는 SQL 등)

5세대 언어

대표: Prolog(부족)

특징: 초고급언어, 인공지능 분야의 원리를 사용하는 시스템을 위해 개발된 언어(자연어 처리 등)

 


[Next] 2주차 실습(Easy CrackMe.exe)

2022.06.12 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

목차 - 샘플 파일을 이용하여 IDA Pro 실행 - 사용자 인터페이스 및 기본 사용법 이해 * 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요) 0. IDA Pro란? 1. 실행 파일 로드 2. 디스어셈..

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
The IDA Pro Book (2nd Edition) 한국어판 - 리버스 엔지니어링에 날개를 달다

 - 목차 - 

 

1부 IDA 소개

1장 | 디스어셈블러 소개

2장 | 리버싱과 디승셈블리툴

3장 | IDA 프로 배경 지식

 

2부 IDA 기본 사용법

4장 | IDA 시작

5장 | IDA 데이터 디스플레이

6장 | 디스어셈블리 살펴보기

7장 | 디스어셈블리 다루기

8장 | 데이터 타입과 데이터 구조

9장 | 상호 참조와 그래프

10장 | 여러 가지 IDA

 

3부 IDA 고급 사용법

11장 | IDA 커스터마이징

12장 | FLIRT 시그니처로 라이브러리 인식

13장 | IDA 심층 탐구

14장 | 바이너리 패칭과 IDA 제약 사항

 

4부 IDA의 기능 확장

15장 | IDC 스크립팅

16장 | IDA SDK

17장 | IDA 플러그인 아키텍처

18장 | 바이너리 파일과 IDA 로더 모듈

19장 | IDA 프로세서 모듈

 

5부 실제 애플리케이션

20장 | 다양한 컴파일러

21장 | 난독화된 코드 분석

22장 | 취약점 분석

23장 | 실제 IDA 플러그인

 

6부 IDA 디버거

24장 | IDA 디버거

25장 | 디스어셈블러/디버거 통합

26장 | 추가 디버거 기능

 

부록 A IDA 5.0 무료 버전 사용

부록 B IDC/SDK 상호 참조

 

Practical Malware Analysis (실전 악성코드와 멀웨어 분석) / 마이클 시코스키·앤드류 호닉 지음, 여성구·구형준·박호진 옮김 / 에이콘

 - 목차 - 

 

0장 | 악성코드 분석 입문

 

1부 기초 분석

1장 | 기초 정적 분석 기법

2장 | 가상 정적 분석 기법

3장 | 기초 동적 분석

 

2부 고급 정적 분석

4장 | X86 디스어셈블리 속성 과정

5장 | IDA Pro

6장 | 어셈블리어에서의 C 코드 구조 식별

7장 | 악의적인 윈도우 프로그램 분석

 

3부 고급 동적 분석

8장 | 디버깅

9장 | OllyDbg

10장 | WinDbg를 이용한 커널 디버깅

 

4부 악성코드의 기능

11장 | 악성코드의 행위 특성

12장 | 위장 악성코드 실행

13장 | 데이터 인코딩

14장 | 악성코드 기반 네트워크 시그니처

 

5부 안티리버싱

15장 | 안티디스어셈블리

16장 | 안티디버깅

17장 | 안티가상머신 기법

18장 | 패커와 언패킹

 

6부 특별한 주제

19장 | 셸코드 분석

20장 | C++ 분석

21장 | 64비트 악성코드

 

부록

부록A | 주요 윈도우 함수

부록B | 악성코드 분석 도구

부록C | 실습 문제 풀이

 

 

728x90
728x90

+ Recent posts