반응형

 

소스코드 분석과 바이너리 분석이란 무엇인가요?

일반적으로 우리가 프로그래밍 언어를 공부하거나 해킹, 보안 등을 공부하다 보면 자주 접하게 되는 용어 중 하나가 분석입니다.

이때 말하는 분석이라는 단어는 여러 가지 의미를 내포하고 있지만,

주로 어떤 프로그램 코드나 데이터 구조 등을 해석하거나 이해하는 행위를 말합니다.

그리고 이러한 분석 작업을 수행하기 위해서는 해당 분야에 대한 전문 지식이 요구됩니다.

즉, IT 업계에 종사하시는 분들에게 분석 능력은 필수적인 요소라고 할 수 있습니다.

크게 분석 방법에는 소스코드 분석과 바이너리 분석이 존재하는데

이번 글에서 위 두 분석 방법에대해 설명드리고자 합니다.


 

Ai 인공지능 ChatGPT에게 소스코드 분석과 바이너리 분석이 어떤 것인지 질의를 해보도록 합시다.

소스코드 분석

  • 정의: 소프트웨어의 원본 코드를 검토하고 분석하는 과정입니다.
  • 목적: 코드의 이해, 품질 향상, 효율성 증가, 보안 강화.
  • 한계: 제3자 라이브러리나 배포 단계에서의 취약점 탐지에 한계가 있습니다.

바이너리 분석

  • 정의: 컴파일된 소프트웨어의 바이너리 형태를 검토하고 분석하는 과정입니다.
  • 목적: 소스 코드에 의존하지 않고 실행 가능한 프로그램의 보안 문제 및 취약점 찾기.
  • 범위: 소프트웨어 전체, 운영 체제 취약점, 바이너리 레벨 하드웨어 구성 등을 포함합니다.

 

바이너리 분석과 소스코드 분석은 뭐가 다른건가요?


소스코드 분석

소스코드 분석은 소프트웨어 원본 코드를 검토하고 분석하는 과정으로, 개발자가 작성한 코드의 이해, 품질 향상, 효율성 향상 및 보안 목적으로 사용됩니다. 코드 기능, 비즈니스 로직, 변수 및 데이터 사용, 조건 및 반복문 등 전체 코드 구조를 이해하는데 도움이 됩니다.

탐지 범위

소스코드 분석은 원본 코드에 대한 보안 위협, 코드 품질 문제 및 코드 최적화를 찾는 데 도움이 됩니다. 그러나 제 3자 라이브러리 및 배포 단계에서 발생하는 취약점은 이러한 분석으로 찾기 어렵습니다.

 

바이너리 분석

바이너리 분석은 컴파일된 소프트웨어의 바이너리 형태(즉, 기계에서 실행되는 형태)를 검토하고 분석하는 과정입니다. 소스 코드에 의존하지 않고, 컴파일된 프로그램에서 직접 작동 원리, 깨지지 코드, 취약점 및 보안 문제를 찾을 수 있습니다.

 

탐지 범위

바이너리 분석은 컴파일된 프로그램 전체를 포함하여 문제를 찾기 위해 소프트웨어의 모든 부분을 다룹니다. 운영 체제의 취약점, 바이너리 레벨 하드웨어 구성 및 프레임워크와 스크립트와 같은 컴파일 후 추가되는 요소의 보안 위협을 감지할 수 있습니다.

소스코드 분석을 하는 이유


보통 대부분의 프로젝트 진행 시 설계 단계에서부터 소스코드 분석을 고려하게 됩니다.

왜냐하면 소스코드 분석을 통해서 문제 발생 지점을 미리 예측하고 효율적인 해결책을 제시할 수 있기 때문입니다.

예를 들어 다음과 같은 상황을 가정해봅시다.

“A라는 클래스 모듈안에 B라는 메서드가 있고, A클래스 객체 생성 후 B메서드를 호출하면 C라는 결과 값이 반환된다.”

class A:
    def B(self):
        return "C"

# A 클래스의 객체 생성
a_instance = A()

# B 메소드 호출 후 결과값 저장
result = a_instance.B()

# 결과값 출력
print(result)  # 출력: C

만약 위와 같은 형태의 간단한 코드로 구성된 프로그램이라면 누구나 쉽게 수정해서 원하는 결과를 얻을 수 있습니다.

하지만 만약 “A라는 클래스 모듈안에 B라는 메서드가 있고, A클래스 객체 생성 후 B메서드를 호출하면 C라는 결과 값이 반환된다.”라는 문장이 수십 개 이상 반복되는 복잡한 알고리즘을 가진 프로그램이라면 어떨까요?

이럴 경우 각 메소드마다 일일이 주석을 달아주는 것은 매우 비효율적이며, 자칫 잘못하면 오류가 발생할 확률이 높습니다.

그렇기 때문에 처음부터 모든 메서드에 대한 자세한 주석을 달기보다는

전체적인 흐름을 파악하며 큰 그림을 그리는 것이 좋습니다.

이를 위해 우선 현재 상태를 점검해야 하는데, 이때 유용하게 사용될 수 있는 도구가 바로 소스코드 분석입니다.

 

바이너리 분석을 하는 이유

 

바이너리 분석은 소프트웨어 개발 및 보안 분야에서 매우 중요한 역할을 합니다. 이는 특히 소스코드가 직접적으로 사용할 수 없거나, 컴파일 후의 프로그램 동작을 이해하고 검증해야 할 때 필요합니다.

 

바이너리 분석은 컴파일된, 즉 실행 가능한 형태의 프로그램을 분석하는 과정입니다. 이 과정은 특히 다음과 같은 상황에서 중요합니다

소스코드 접근 불가: 때때로, 특히 공개되지 않은 소프트웨어나 써드파티 제품을 다룰 때, 소스코드에 접근할 수 없습니다. 이럴 때 바이너리 분석을 통해 소프트웨어의 작동 방식을 이해하고 문제점을 찾을 수 있습니다.
컴파일 과정 중 문제 발견: 컴파일 과정은 소스코드를 실행 가능한 형태로 변환합니다. 이 과정에서 추가적인 최적화나 변경이 일어날 수 있으며, 이로 인해 새로운 취약점이나 버그가 발생할 수 있습니다. 바이너리 분석을 통해 이러한 문제를 탐지할 수 있습니다.
보안 취약점 탐지: 특히 해킹이나 보안 분야에서, 바이너리 분석은 소프트웨어의 보안 취약점을 찾는 데 중요합니다. 컴파일된 프로그램에서 직접적으로 취약점을 찾아내어 공격 가능성을 평가할 수 있습니다.
리버스 엔지니어링: 때때로, 특정 소프트웨어의 기능을 이해하거나 호환성을 확보하기 위해 리버스 엔지니어링이 필요할 수 있습니다. 바이너리 분석은 이 과정에서 핵심적인 역할을 합니다.

앞서 말씀드린 바와 같이 소스코드 분석은 반드시 거쳐야 하는 과정이지만,

그렇다고 해서 소스코드 분석만으로 모든 문제점을 찾아낼 수 있는 것은 아닙니다.

특히 규모가 크고 복잡한 프로그램일수록 소스코드 분석만으로는 한계가 생길 수밖에 없습니다.

그렇다면 어떻게 해야 할까요? 정답은 바로 ‘다른 분석 방법’을 병행하는 것입니다.

대표적인 예가 바로 디버깅입니다.

하지만 이번 시간에는 소스코드 분석과 바이너리 분석에 대해서만 살펴보겠습니다.

물론 둘 다 좋은 분석 방법이지만,

각각의 장단점이 명확하므로 목적에 맞게 적절히 활용한다면 더욱 효과적으로 업무를 수행할 수 있을 것입니다.

우리 모두 안전하고 깨끗한 보안을 이루어갑시다!


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

댓글에 남겨주신 내용

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

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

-

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

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

감사합니다!

반응형
반응형

Mac 주소?
IP 주소?

iP 주소, MAC 주소..
저희가 IT 업계로 들어오거나 인터넷 통신 혹은 게임을 할 때에도 간간히 들어봤던 이름일 겁니다.
여러분은 무엇인지 둘의 차이는 무엇인지 알고 계신가요?

먼저 인터넷에 검색해서 두 가지의 설명을 살펴봅시다.


IP 주소 (Internet Protocol address, IP address, 인터넷 규약 주소)는
컴퓨터 네트워크에서 장치들이 서로를 인식하고 통신을 하기 위해서 사용하는 특수한 번호이다.

MAC 주소(Media Access Control Address)는
네트워크 세그먼트의 데이터 링크 계층에서 통신을 위한 네트워크 인터페이스에 할당된 고유 식별자이다.


무슨 말인지 쉽게 좀 설명해 줄래?


우리가 MAC 주소에 대해 시작하기 전에 먼저 iP 주소에 대해서 아직 모르시는 분이 계시다면 아래 글을 한번 읽고 와주세요!
https://jdcyber.tistory.com/27

 

iP 주소란 무엇일까? (쉬운 설명, 개념, 정의, 호스트 아이디, 네트워크 아이디, 서브넷 마스크)

iP 주소란 무엇인가요?정답은 컴퓨터마다 가지고 있는 주소 즉 이름입니다. 192.168.123.132 위와 같은 형태의 아이피 주소를 많이 보셨을겁니다. 위와 같이 A컴퓨터 너의 이름은 오늘부터 192.168.123.13

jdcyber.tistory.com

 



자 쉽게 설명을 시작해 보도록 하죠
우선 인터넷상에서 검색해 보니 두 가지다 컴퓨터 주소라고 합니다.
우리는 위의 글에서 iP가 주소다.
즉 iP를 할당해서 컴퓨터 너의 이름은 192.168.2.33 야라고 정해준다고 말했습니다.

네 맞습니다.
우리는 보통 한국에서 저 멀리 있는 미국과 컴퓨터로 통신하기 위해 IP 주소를 사용합니다.
실제로 통신을 주고받을 때 내부적으로 어떻게 동작하는지를 살짝 깊게 들여다보면,
IP 주소는 MAC 주소 즉 맥 어드레스로 바꿔서 사용되게 됩니다.
그렇기 때문에 IP 주소 사용한다는 말은 결국 맥 주소를 사용한다고 말할 수 있는 것이죠
쉽게 말해 IP 통신 내부에 맥 주소가 포함되어 있다고 생각하시면 됩니다.

그러면 여기서 질문 하나 생기실겁니다.

그럼 iP주소와 MAC 주소 둘 다 주소라면서
왜 두 개나 필요한 거죠?

 


우리는 데이터를 전송하기 위해서 수많은 스위치를 통과하여 목적지까지 도달하게 됩니다.
이때 우리는 해당 데이터를 포장하게 됩니다.
우리는 이전 글에서 이 행위를 인캡슐레이션이라고 한다고 말씀드렸고,
이 쌓여있는 포장지를 벗겨서 안에 내용물을 확인하는 과정을
디캡슐레이션이라고 했습니다.

인캡슐레이션, 디캡슐레이션의 내용은 아래 링크를 통해 확인해 주세요

https://jdcyber.tistory.com/28

 

인캡슐레이션? 디캡슐레이션? 데이터 전송하기 (쉬운 설명, 개념, 정의)

오늘은 인캡슐레이션과 디캡슐레이션이 무엇인지 확인해 보는 시간을 가지도록 하겠습니다. 아주 쉽게 설명해드릴테니 아래 검색 결과를 읽다가 포기하지 말아 주세요! 인캡슐레이션과 디캡슐

jdcyber.tistory.com

이때 각 스위치에서 매번 나의 데이터의 포장을 벗겨버리면
내가 보내려던 데이터를 각 스위치에서 모두 열어보는 거잖아요?
이렇게 되면 보안상의 문제도 있고 다시 다음 스위치로 보내기 위해서
처음부터 데이터를 포장을 해야 한다는 번거로움과 과부하 느려짐이 발생하겠죠
그래서 한 장 한 장 포장을 순차적으로 벗겨 각 스위치에서 필요한 부분까지만 데이터를 들여다보게 되는데
데이터는 최종 목적지까지 도달할 때까지 즉 가장 아래부터 하나씩 벗겨지게 됩니다.

위 사진처럼 맥 주소는 데이터 링크, 아이피는 네트워크 계층에서 사용되죠
그러다 보니 맥 주소는 아이피에 포함되어 있다고 말하는 겁니다.

이해가 좀 가시죠?


즉,
MAC 주소 (맥 주소, 맥 어드레스)는 컴퓨터 간 데이터를 전송하기 위한 컴퓨터의 물리적 주소로서
Data Link 계층인 2 계층에서 쓰이게 되고 iP는 네트워크 계층인 3 계층에서 쓰이게 됩니다.
조금은 이해가 되셨나요?

또한 검색을 하다 보면 아래의 내용을 확인해 볼 수 있습니다.
맥 주소를 물리적 주소, iP를 논리적 주소라고 합니다.

또 자기들만 알아듣는 한국어도 아닌 말로
하고 있다 그렇죠?

위 내용을 쉽게 표현해 보겠습니다.


교장 선생님이 강단에서 주민등록증을 확인하고 학생들을 한 명씩 불러서 졸업장을 나눠줍니다.
이때 주민등록증을 보고 한 명씩 부르는 행위를 물리적 방법이라고 해볼게요

이게 비효율적이라고 판단한 교장 선생님은 각 반의 선생님을 불러서
반 별로 선생님에게 학생들의 주민등록증을 나눠줍니다.
그리고 선생님은 아이들을 확인하고 졸업장을 주기 시작하죠 이걸 논리적 방법이라고 하겠습니다.

MAC = 물리적
iP = 논리적

맥 주소와 iP 주소를 물리적 논리적이라는 위 내용에 빗대어 생각해 볼게요
이제 iP 주소와 MAC 주소를 우리가 왜 사용하는지 조금은 이해가 되시죠?
(선생님은 계속해서 바뀔 수 있다고 가정하고 학생은 절대 바뀌지 않는다는 가정을 해보면 위의 내용이 잘 성립이 될 것 같습니다.)


맥 주소
pc가 가지고 있는 변하지 않는 자신의 고유한 번호

ip 주소
할당되어 가지고 있는 변동성 있는 주소


궁금하신 사항은 댓글에 남겨주세요
댓글에 남겨주신 내용은
추후 정리해서 올려드리겠습니다
이웃 신청하시면 업로드 시 알려드릴게요!
-
조금이라도 도움이 되셨다면
공감&댓글 부탁드리겠습니다
감사합니다!

반응형
반응형

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를 사용하지 않는 사이트에 대해 경고를 표시합니다.

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

댓글에 남겨주신 내용

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

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

-

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

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

감사합니다!

반응형

+ Recent posts