반응형

일상생활을 할 때는 필요 없지만 컴퓨터를 배우거나 네트워크 리눅스 파이썬 개발 등을 하시게 되면

컴퓨터가 사용하는 2진수를 배워야 하는데요

우리가 사용하는 iP 주소는 192.168.123.132 이러한 형태를 가지고 있습니다.

위 모습은 저희에게 친숙한 10진수의 형태이며 우리의 컴퓨터는 모두 2진수만을 사용하고 있습니다.

그렇다면 컴퓨터는 저희가 치고 있는 10진수를 어떻게 연산하고 있을까요??

처음에는 너무 어렵지만 알고 보면 너무 쉬운 2진법과 저희가 쓰고 있는 10진법을 알려드리도록 하겠습니다.

 

(진법? 수? 헷갈리지 마세요 2진법으로 수를 나타내면 2진 수고 10진법으로 수를 나타내면 10진수입니다!)

아래 글을 눈으로만 읽지 마시고 한 번씩만 써보시면 따로 공부하실 필요가 없습니다.

저도 처음에는 눈으로만 보다가 나중에 따로 써보면서 이해했습니다!

그러니 읽으면서 한 번씩 써봐주시면 이해하시기 편하실 거예요!

저희가 흔히 쓰고 있는 10진법은 0을 포함한 0부터 9로 바로 10가지 숫자로 이루어져 있는 표기법인데요

15까지만 10진수로 표현해 보겠습니다.


10진수
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   

0,1,2,3,4,5,6,7,8,9 그다음으로는 1이 올라가서 10,11,12,13,14,15,16,17,18,19 이런 식으로 쓰이고 있죠?

2지법도 형태는 똑같습니다 다만 0과 1두 가지 숫자로 이루어져 있을 뿐입니다 위의 표를 2진수로 표현해 보겠습니다.

2진수
0
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
1101
1110
1111
   

천천히 한번 쓰면서 읽어보시면 아~ 하고 이해하기 쉬우실 거예요!

우리가 사용하고 있는 10진법은 10의 거듭제곱으로 자릿수가 증가하잖아요?

(10^0 = 1) (10^1 = 10) (10^2 = 100) (10^3 = 1000)

만약 7,536의 자릿수를 제곱으로 표현해 본다면 아래 표와 같이 표현할 수 있습니다.

7
5
3
6
10^3
10^2
10^1
10^0
1000의 자리
100의 자리
10의 자리
1의 자리

신기하지 않나요? (저만 신기한가요.. 저는 여태까지 쓰면서도 잘 몰랐습니다..)

2진법을 한번 볼까요? 마찬가지로 2지법도 2의 거듭제곱으로 자릿수가 증가합니다.

(2^0 = 1) (2^1 = 2) (2^2 = 4) (2^3 = 8) (2^4 = 16) (2^5 = 32) (2^6 = 64) (2^7 = 128)

그렇다면 2진수 1011을 10진수로 바꿔보면 몇이 될까요? 아래 표로 확인해 볼게요!

1
0
1
1
2^3 = 8
2^2 = 4
2^1 = 2
2^0= 1
8
0
2
1

위의 표가 한 번에 이해가신다면 너무 좋겠지만 저도 처음에는 잘 이해가 가지 않아서

몇 번을 다시 읽어봤어요 그럴 때는 조금 더 쉬운 방법이 있습니다.

iT를 공부하실 때 8비트라고 해서 보통 8자리로 구성되어 있는데요

딱 8개만 외우면 됩니다 외운다기보다 이미 알고 계시는 걸 이용하는 겁니다

아래 표를 이용하여 2진수 11111111을 계산해 보도록 해보죠 1의 자리부터 2의 제곱으로 올라갑니다.

1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255가 됩니다. 그러므로 11111111 = 255

1
1
1
1
1
1
1
1
1
2
4
8
16
32
64
128

헷갈리실 수 있으니까 한 번 더 설명할게요!!

가장 오른쪽은 "1"의 자리, 한 칸 왼쪽은 "2"의 자리, 다음은 "4"의 자리, "8"의 자리, "16"의 자리 ...

순서로 계산하시면 됩니다.

모든 자릿수를 합산하여 10진수를 구할 수 있습니다.

하나만 더 예를 들어서 2진수 [10011] 은 5자리로 사용되는 제곱은 1의 자리부터 (2,4,6,8,16) 즉 1+2+16=19 와 같습니다.


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

HTTP
(HyperText Transfer Protocol)

 

HTTP는 HyperText Transfer Protocol의 약자로,

인터넷에서 데이터를 주고받을 수 있는 프로토콜입니다.

웹 서버와 클라이언트(웹 브라우저) 간에 통신을 가능하게 합니다.

웹브라우저를 사용하거나 개발할 때 클라이언트와 서버가 정보를 교환하는

가장 기본적인 프로토콜입니다.

HTTP (HyperText Transfer Protocol)는 웹 상에서 정보를 주고받을 때 사용하는 규칙인데,
'무상태(Stateless) 프로토콜'이라고 불립니다.
이 말은 HTTP를 사용할 때, 웹 서버가 사용자의 이전 활동이나 상태를 기억하지 않는다는 것을 의미합니다.
간단히 말해서, 서버는 각 요청을 완전히 새로운 것으로 처리하고, 이전 요청과의 연결을 유지하지 않습니다.

하지만, 웹사이트가 사용자의 정보나 선호도를 기억하는 것이 필요할 때가 있습니다. 
예를 들어, 온라인 쇼핑을 하면서 장바구니에 상품을 담거나, 로그인을 유지하는 경우 등이 이에 해당합니다. 
이런 경우, HTTP '쿠키(Cookies)' '세션(Sessions)'이라는 방법을 사용합니다. 
쿠키는 사용자의 컴퓨터에 작은 정보를 저장하는 것이고, 세션은 서버 측에서 사용자의 정보를 일정 시간 동안 유지하는 방법입니다. 
이를 통해 웹사이트는 사용자의 정보를 일시적으로 기억하고,  개인화된 사용자 경험을 제공할  있게 됩니다.

 

HTTPS
(HyperText Transfer Protocol Secure)

 

HTTPS는 HyperText Transfer Protocol Secure의 약자로,

HTTP에 데이터 암호화 기능을 추가한 보안 프로토콜입니다.

쉽게 말해,

SSL을 사용하는 HTTP 프로토콜의 보안 버전입니다.

HTTPS 프로토콜을 사용하면 웹 사이트 사용자가 인터넷을 통해 신용 카드 번호,

은행 정보 및 로그인 자격 증명과 같은 중요한 데이터를 안전하게 전송 있습니다.


HTTP와 HTTPS의 주요 차이점

1. HTTPS는 SSL/TLS를 통해 전송되는 데이터를 암호화하여 보안을 강화하는 반면, HTTP는 이러한 보안 조치가 없습니다.

2. 일반적으로 HTTP는 80번 포트를 사용하고, HTTPS는 443번 포트를 사용합니다.

3. 초기에는 HTTPS가 HTTP보다 느리다고 여겨졌으나, 현대의 기술 발전으로 이러한 차이는 크게 줄어들었습니다.

4. HTTPS는 웹사이트의 신뢰성을 높여주며, 많은 브라우저에서는 HTTPS를 사용하지 않는 사이트에 대해 경고를 표시합니다.

궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

이웃 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

제로트러스트
아무것도 믿지말고 항상 검증하라

제로트러스트 Zero Trust

"아무것도 신뢰하지 마라"

 

제로 트러스트(Zero Trust)는 현대 IT 보안 분야에서 중요한 개념으로,

"아무것도 신뢰하지 마라"는 원칙을 가지고 있습니다.

이는 인터넷상에서 정보를 주고받는 모든 행위에 대해 근본적으로 의심하고,

모든 접근을 검증하는 보안 접근 방식을 말합니다.

 

예를 들어, 크x 브라우저, 카카x 메신저, 알x 백신 등의 소프트웨어를 다운로드하고 사용할 때,

제로 트러스트 접근법은 이러한 애플리케이션들이 안전하다고 가정하지 않고,

그들의 보안 수준을 지속적으로 검증하고 모니터링하는 것을 의미합니다.


제로 트러스트의 등장 배경

 

전통적인 보안 모델은 내부 네트워크를 신뢰하고 외부를 불신하는 방식으로 구성되어 있었습니다.

이 모델은 방화벽과 가상 사설망(VPN)을 중심으로 하여,

내부 네트워크에 대한 접근을 기본적으로 신뢰했습니다.

하지만 클라우드 컴퓨팅, 모바일 장치, IoT 기기의 대중화로 인해

보안 환경이 변화하면서 이러한 전통적인 접근 방식의 한계가 드러났습니다.

제로 트러스트 모델은 이러한 변화에 대응하여 등장했습니다.

 


제로 트러스트의 핵심 원칙

  1. 최소 권한 (Least Privilege): 사용자는 필요한 최소한의 권한만을 부여받으며, 이를 통해 잠재적인 위협으로부터의 공격을 방지합니다.
  2. 인증 및 접근 제어 (Authentication and Access Control): 모든 사용자와 장치는 인증을 거쳐야 하며, 식별과 권한 검증이 이루어집니다.
  3. 네트워크 분할 (Network Segmentation): 네트워크는 보안 영역으로 세분화되며, 각 영역은 다른 영역과 격리됩니다.
  4. 다중 요인 인증 (Multi-Factor Authentication): 단일 인증 요소만으로는 부족하므로, 추가적인 보안 계층을 위해 다중 요인 인증을 사용합니다.
  5. 이상 징후 감지 (Anomaly Detection): 사용자 및 장치의 행위를 지속적으로 모니터링하여 이상 징후를 감지합니다.
  6. 암호화 (Encryption): 데이터의 안전한 전송과 저장을 위해 암호화를 사용합니다.

 

기존의 보안체제와 제로트러스트 보안의 차이점

구분 제로트러스트 보안 기존 보안 모델
신뢰 원칙 내부 및 외부 네트워크 모두를 기본적으로 불신 내부 네트워크를 신뢰하고 외부를 불신
접근 제어 지속적인 인증과 권한 검증 필요 일단 인증되면 네트워크 내부 자원에 대한 접근이 허용
네트워크 보안 네트워크 전체에 걸쳐 일관된 보안 정책 적용 주로 네트워크 경계에 중점을 둔 보안
인증 방법 다중 요인 인증(MFA) 및 동적 권한 부여 단일 요인 인증(예: 비밀번호)
보안 전략 최소 권한 원칙 및 지속적인 모니터링 전통적인 방어벽 및 안티바이러스에 의존
데이터 보호 모든 데이터 전송 및 저장에 대한 암호화 주로 중요한 데이터에만 암호화 적용
투명성 및 통제 높은 수준의 투명성 및 사용자 행동 분석 제한적인 통제 및 투명성
적응성 클라우드, 모바일, IoT 등 다양한 환경에 유연 주로 고정된 IT 환경에 적합
위협 대응 실시간 위협 탐지 및 대응 주로 과거의 위협 패턴에 기반한 대응

 


미국의 제로트러스트 보안 가이드라인

 

사이버보안 및 인프라보안국(CISA)은

2023년 4월 제로 트러스트 성숙도 모델(Zero Trust Maturity Model, ZTMM)의 업데이트 버전을 발표했습니다.

이 업데이트된 모델은 연방 기관들이 제로 트러스트 아키텍처로 전환하기 위한 종합적인 로드맵을 제공하며,

다섯 가지 주요 영역에 걸쳐 구현 지침을 제공합니다. 이 모델은 연방 기관뿐만 아니라

주, 지방, 부족, 영토 정부 및 민간 부문에서도 사용할 것을 권장합니다.

모델의 목적은 기관들이 시간이 지남에 따라 제로 트러스트 아키텍처의 최적화를 향해

소규모 개선을 할 수 있도록 하는 것입니다.

업데이트된 ZTMM의 핵심 초점은 데이터, 네트워크, 인프라에 대한 접근을 최소한으로 유지하고

그 접근의 정당성을 지속적으로 검증하는 것입니다.

새로운 성숙도 모델은 "초기(Initial)" 단계를 도입하고

전체적으로 네 단계의 성숙도(전통적, 초기, 고급, 최적)를 포함합니다.

각 단계에서 CISA는 제로 트러스트 아키텍처 구현을 위한 계획 및 결정을 고려할 때

고려해야 할 여러 새로운 기능을 추가하고 기존 기능을 업데이트했습니다.


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

와이어샤크란?

 

오늘은 와이어샤크 사용법에 대해 간단히 알아보겠습니다.

그전에 혹시 와이어샤크에 대해 모르시는 분들은

 

와이어샤크의 개념과 설치법도 함께 적어놨으니

아래 글을 읽어보고 와주시길 바랍니다

https://jdcyber.tistory.com/10

 

와이어샤크란? #1 (Whireshark) (쉬운 설명, 설치, 정의, 개념, 용도)

와이어샤크 WhireShark 란? 초창기에는 ' Ethereal '이라는 이름으로 나왔다가 이후 상표 문제로 ' Wireshark '로 바뀌게 되었습니다. 와이어 샤크는 네트워크 패킷을 캡처하고 분석하는 패킷을 분석하는

jdcyber.tistory.com


와이어 샤크 사용법

 

와이어 샤크를 실행하시면 아래와 같은 창이 뜨실겁니다.

 

Capture라고 쓰여있는 곳 아래

제 화면과 다르게 뜨실 수도 있는데

저곳에 떠있는 내용들은 와이어샤크가

자동으로 찾아준 현재 사용하고 계시는 네트워크를 표시하고 있는 것이니

저와 다르시더라도 걱정하지 마시기 바랍니다.

 

저곳에서 살펴보고 싶은 네트워크를 선택하고

상단 왼쪽에 상어 지느러미를 클릭해 주세요

(이러한 행위를 와이어샤크에서 네트워크를 캡처했다고 부릅니다.)


캡처 (Capture)

 

와이어샤크에서 네트워크를 캡처하기 시작하면

해당 네트워크에서 오고 가는

패킷들이 보이기 시작합니다.

 

패킷이 아직 뭔지 모르신다면

아래 글을 읽어주세요!

https://jdcyber.tistory.com/12?category=1076407

 

패킷(Packet)이란? (쉬운 설명, 구조, 헤더, 인캡슐레이션, 핑, Ping)

패킷 (Packet) 이란 무엇일까요? 패킷은 패키지(package)와 덩어리를 뜻하는 버킷(bucket)의 합성어로 통신망을 통해 전송하기 쉽도록 데이터를 잘게 나눈 전송 단위입니다. ​ 본래 패킷은 소포를 뜻

jdcyber.tistory.com

 

위 사진이 현재 컴퓨터가 네트워크를 통해 쪼개진 데이터 즉 패킷을 주고받는 모습입니다.

 

(아래 메뉴 및 카테고리 설명은 중요한 내용이 아닙니다)

상단에 메뉴를 먼저 살펴보겠습니다.

Edit : 패킷을 찾거나 표시 / 프로그램 속성 설정

Go : 캡처된 데이터를 특정 위치로 이동

Capture: 캡처 필터 옵션 설정 및 캡처 시작/종료

Analyze: 분석 옵션 설정

Statistics: 통계 데이터 확인

Telephony/Wireless : Telephony 또는 Wireless와 관련된 통계/스트림 확인

 

그 아래 있는 카테고리를 한번 살펴보도록 하겠습니다

 

No. : 패킷을 수집한 순서

Time : 패킷이 수집된 시간

Source : 패킷을 보낸 주소

Destination : 패킷 도착 주소

Protocol : 프로토콜 정보

Length : 패킷의 길이

Info : 패킷 정보

필터 (Filter)

 

 

와이어 샤크를 실행하고 배우는 이유는

어떠한 네트워크 상의 문제나 특정 데이터의 흐름을 찾아보고 싶어서 실행한 거잖아요?

그런데 네트워크 상의 모든 내용을 캡처하면 내가 보고 싶은 데이터를 보기가 어려울 수 있습니다.

이때 필요한 기능이 바로 필터라는 것입니다.

패킷 필터를 적용하는 것을 패킷 필터링이라고 부릅니다

(어떻게 부르던 자유니 외우시거나 할 필요는 없습니다)

캡처 방법에는 2가지가 있는데,

원하는 내용만 처음부터 캡처하는 캡처 필터 (Capture Filter)

전체를 캡처하고 필터를 걸어 검색하는 디스플레이 캡처 (Display Filter)가 있습니다.

우리는 캡처 필터는 사용하지 않겠습니다.

위 방법들이 크게 중요하지도 않고

디스플레이 캡처만 알고 계셔도 됩니다

이런 방법이 있구나 알고만 넘어갑시다.


프로토콜 (Protocol) 별 필터 검색

 

프로토콜로 데이터를 검색하는 방법입니다.

DNS: DNS (Domain Name System), 도메인 이름
DHCP: DHCP (Dynamic Host Configuration Protocol), 동적 IP 주소 할당 요청
ICMP: ICMP (Internet Control Message Protocol), 송수신 측의 전송 과정
WLAN: 무선랜

논리 연산자 필터 검색

 

eth.addr
원하는 MAC 주소 필터
!(eth.addr)
입력한 MAC 주소 예외
eth.src
출발지 MAC 주소 설정
eth.dst
목적지 MAC 주소 설정
tcp.port
TCP 포트 설정
!(tcp.port)
입력한 TCP 포트 주소 예외
tcp.srcport
출발지 TCP 포트 설정
tcp.dstport
목적지 TCP 포트 설정
udp.port
UDP 포트 설정
!udp.port
입력한 UDP 포트 예외
udp.srcport
출발지 UDP 포트 설정
udp.dstport
목적지 UDP 포트 설정
ip.addr
IP 필터
!(ip.addr)
입력한 IP 주소 예외
ip.src
출발지 IP 주소 설정
ip.dst
목적지 IP 주소 필터

쉽게 알려주세요

 

지금 우리가 원하는 건 지금 위의 내용이 아니라

데이터의 흐름을 직접 검색해서 보고 싶어요

 

그래서 어떻게 하는건가요??

정말 쉬운 예시 하나로 같이 살펴볼게요!

CMD 프롬프트 혹은 터미널 Terminal에서

nslookup www.naver.com 한번 쳐봅시다

 

아이피가 23.35.221.113이네요?

(아이피는 계속 달라지니 직접 nslookup 해보시고 시도해 주세요)

아이피를 알아냈으니 와이어샤크로 검색해 봅시다

 

위에 논리연산자라고 적어놓은 것 중에 IP 필터라고 있죠?

그걸 앞에 입력하고 위와 같이 입력해 봅시다.

ip.addr == 23.35.221.113

(nslookup에 나온 ip를 치시면 됩니다)

필터를 검색하면 해당 아이피와 통신했던 데이터 패킷만 출력되게 됩니다.

 

저희가 검색한 패킷에서 Three Way Hand Shake을

한번 찾아볼까요?

 

3-Way Hand Shake가 뭔지 모르신다면

아래 글을 읽어봐주세요!

(작성 )

 

위 사진을 보면 오른쪽에 SYN과 ACK를 주고받으며

3-way hand shake를 수행하여 신뢰관계를 맺은 데이터의 흐름을 확인할 수 있습니다.

 

와이어샤크는 얼마나 필터 검색을 잘 하느냐에 따라 전문가와 비전문가로 결정됩니다.

많은 데이터 검색을 해보시고 연산자를 조합해서 원하는 데이터를 검색해낼 수 있다면

성공적인 와이어샤크 전문가 되실 것입니다.


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

 

오늘은 Windows 운영 체제에서 가장 중요한

파일 형식인 Portable Executable(PE)에 대해 이야기하려 합니다.

PE 파일은 .exe, .dll, .sys 등과 같이 실행 가능한 파일들을 가리키며,

이 파일들 간의 복잡한 의존성을 분석하는 것은 소프트웨어 개발과 보안 분석에 있어 매우 중요합니다.

이번 포스팅에서는 PE 파일의 Import Table, Export Table, 그리고 Import Address Table(IAT)을 이용해서

의존성을 분석하고, 이를 그래프로 시각화하는 방법을 소개하겠습니다.


Import table과 export table 그리고 iat의 차이점

 

Import Table, Export Table,

그리고 Import Address Table (IAT)은

모두 Portable Executable (PE) 파일 형식의 구성요소입니다.

테이블이 나타내는 정보가 다르므로 각각의 목적과 기능을 이해하는 것이 중요합니다.


Import Table이란?

이 테이블은 PE 파일이 실행되기 위해 필요한

외부 라이브러리(DLL 파일)들의 정보를 담고 있습니다.

Import Table에는 각 DLL 파일의 이름과 해당 DLL에서 호출할 함수들의 목록이 포함되어 있습니다.

즉, 이 PE 파일이 실행되기 위해 어떤 외부 DLL에 의존하는지,

그리고 그 DLL에서 어떤 함수들을 사용하는지를 알려주는 테이블입니다.


Export Table이란?

이 테이블은 DLL 파일이 외부에 제공하는 함수나

변수의 정보를 담고 있습니다.

DLL 파일은 여러 개의 PE 파일에서 공유하여

사용할 수 있는 라이브러리로서,

그 안에 정의된 여러 함수들을 외부에 제공합니다.

Export Table은 이러한 함수들의 목록과

그 함수들의 주소 정보를 제공합니다.

따라서, 다른 PE 파일들이 이 DLL 파일을 어떻게

활용할 있는지를 알려주는 테이블입니다.


Import Address Table (IAT)이란?

 

이 테이블은 PE 파일이 Import Table을 통해 가져온 외부 함수들의 주소를 저장하는 곳입니다.

즉, Import Table에서 나열한 각 함수에 대한 실제 메모리 주소를 가지고 있습니다.

PE 파일이 실행되면, 로더는 이 IAT를 채워 넣어서, PE 파일이 각 함수를 호출할 때 메모리에서 바로 찾을 있도록 합니다.


Import Table은 '무엇'이 필요한지(어떤 DLL과 함수들이 필요한지),

Export Table은 '무엇'을 제공하는지(어떤 함수와 변수들을 제공하는지),

IAT는 '어디에' 있는지(각 함수의 메모리 주소는 어디인지)를 나타냅니다.

이 세 가지 테이블은 PE 파일이 외부 라이브러리와 어떻게 상호작용하는지를 이해하는데 중요한 역할을 합니다.

PE 파일 의존성 그래프 생성

 

필요한 라이브러리 작업을 수행하기 위해 pefile networkx라는 가지 파이썬 라이브러리를 사용하겠습니다.

pefile은 PE 파일을 분석하고 파싱하는데 필요한 라이브러리이며,

networkx는 그래프를 생성하고 시각화하는데 사용됩니다.

먼저, 주어진 디렉토리에서 모든 PE 파일을 찾고 이들을 파싱하여 그래프의 노드로 추가합니다.

그런 다음 각 PE 파일의 Import Table을 분석하여 필요한 DLL을 그래프에 추가하고,

이들 사이의 의존성을 간선으로 표현합니다.

PE 파일 의존성 그래프 업데이트 그 다음 단계에서는 모든 PE 파일의 Export Table을 분석합니다.

이를 통해 각 DLL이 제공하는 함수를 알 수 있습니다.

이 함수들을 사용하는 다른 PE 파일을 찾아 그래프에 의존성을 추가합니다.

IAT 정보 출력 마지막으로, 각 PE 파일의 Import Address Table(IAT)를 분석하여

각 함수가 실제로 어떤 메모리 주소에서 호출되는지를 출력합니다.

그래프 시각화 모든 정보를 바탕으로 그래프를 생성한 후에는

networkx와 matplotlib를 이용해서 그래프를 시각화합니다.

이를 통해 각 PE 파일 간의 복잡한 의존성을 한눈에 확인할 수 있습니다.

 

(아래는 예시 코드입니다)

import os
import pefile
import networkx as nx
import matplotlib.pyplot as plt

def create_dependency_graph(directory):
    G = nx.DiGraph()

    pe_files = {}

    # 모든 PE 파일을 파싱한다.
    for filename in os.listdir(directory):
        filepath = os.path.join(directory, filename)

        # PE 파일이 아닌 경우 건너뛴다.
        if not pefile.isPE(filepath):
            continue

        pe = pefile.PE(filepath)

        # 파싱한 PE 파일을 저장한다.
        pe_files[filename] = pe

        # 현재 파일 노드를 그래프에 추가
        G.add_node(filename)

    # 모든 PE 파일의 Import 정보를 통해 그래프를 만든다.
    for filename, pe in pe_files.items():
        if hasattr(pe, "DIRECTORY_ENTRY_IMPORT"):
            for entry in pe.DIRECTORY_ENTRY_IMPORT:
                dll_name = entry.dll.decode('utf-8')

                G.add_node(dll_name)
                G.add_edge(filename, dll_name)  # 현재 파일에서 DLL로 의존성 표시

                # IAT 정보를 출력한다.
                for imp in entry.imports:
                    print(f'{filename} imports function {imp.name} from {dll_name} at address {hex(imp.address)}')

    # 모든 PE 파일의 Export 정보를 통해 그래프를 업데이트한다.
    for filename, pe in pe_files.items():
        if hasattr(pe, "DIRECTORY_ENTRY_EXPORT"):
            for exp in pe.DIRECTORY_ENTRY_EXPORT.symbols:
                # 해당 PE 파일이 export하는 함수를 사용하는 다른 PE 파일을 찾는다.
                for user_filename, user_pe in pe_files.items():
                    if hasattr(user_pe, "DIRECTORY_ENTRY_IMPORT"):
                        for entry in user_pe.DIRECTORY_ENTRY_IMPORT:
                            if entry.dll.decode('utf-8') == filename:
                                for imp in entry.imports:
                                    if imp.name == exp.name:
                                        G.add_edge(user_filename, filename)  # 다른 파일에서 현재 파일로 의존성 표시

    return G

# 디렉토리 지정 (PE 파일들이 위치한 디렉토리를 지정해야 함)
directory = './PE_files_directory'  
G = create_dependency_graph(directory)

# 그래프를 그림
nx.draw(G, with_labels=True)
plt.show()

 

정리

 

이 포스트에서는 PE 파일의 Import Table, Export Table,

그리고 IAT를 이용해 PE 파일 간의 의존성을 분석하고 시각화하는 방법을 살펴봤습니다.

 

다시 한번 정리해보면,

Import Table: PE 파일이 실행되기 위해 필요한 외부 라이브러리(DLL 파일)들의 정보
Export Table: DLL 파일이 외부에 제공하는 함수나 변수의 정보
(다른 PE 파일들이 이 DLL 파일을 어떻게 활용할 수 있는지를 알려주는 테이블)
Import Address Table (IAT): PE 파일이 Import Table을 통해 가져온 외부 함수들의 주소를 저장하는 곳

 

Import Table은 '무엇'이 필요한지

(어떤 DLL과 함수들이 필요한지)

 

Export Table은 '무엇'을 제공하는지

(어떤 함수와 변수들을 제공하는지),

 

IAT는 '어디에' 있는지

(각 함수의 메모리 주소는 어디인지)

 

이 방법을 통해 복잡한 소프트웨어 시스템의 구조를 이해하고, 문제를 분석하고, 솔루션을 찾는 데 도움이 될 수 있습니다.

다음 포스팅에서는 더 심화된 분석 기법을 적용해보겠습니다.

 

그럼, 즐겁게 코딩하시길 바랍니다!


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형

+ Recent posts