인덱스 바이너리

마지막 업데이트: 2022년 2월 18일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
ETF 란 무엇인가? feat. 상장지수펀드

C++ File IO

C++ 에서 파일과 관련하여 3개의 스트림 클래스를 지원하고 있다. 이들은 모두 istream, ostream 으로부터 인덱스 바이너리 파생된 클래스이며 키보드와 모니터에 입력 기능을 가진 cin, cout 은 각각 istream, ostream 클래스의 객체이다. 아래의 파일을 다루는 입출력 스트림들은 istream, ostream 클래스로부터 파생되었기 때문에 사용하는 방법이 cin, cout 객체와 유사한 점이 많아서 그리 어렵지 않게 익힐 수 있다

  • ofstream : 파일에 쓰는 기능의 스트림 클래스
  • ifstream : 파일로부터 읽어오는 기능의 스트림 클래스
  • fstream : 파일에 대한 읽고 쓰는 기능을 모두 갖춘 스트림 클래스
  • wifstream : 유니코드 문자로 쓰여진 텍스트 파일 읽는 스트림
  • wofstream : 유니코드 문자를 텍스트 파일에 쓰는 스트림

파일출력스트림( ofstream )을 이용한 기본적인 파일쓰기

파일 경로에 한글 인덱스 바이너리 이 포함된 경우와 파일 내용 에 한글 을 쓰는 예

  • ios::in input
  • ios::out output
  • ios::ate at the end. 파일 내용의 위치를 가리키는 포인터를 파일의 맨 끝으로 이동한다. 디폴트로 파일의 시작부분
  • ios::binary binary
  • ios::app 파일 내용 끝에 이어쓰기
  • ios::trunc 파일의 기존 내용을 버리고 새로 시작

open() 함수의 두번째 아규먼트로 파일 열기 모드를 설정 한 예

ofstream은 열기 디폴트 모드가 ios::out 으로, ifstream은 ios::in 모드로, fstream은 ios::in | ios::out 으로 설정되어 있음. 여러가지 열기 모드가 동시에 필요하다면 OR 연산자( | )로 연결하여 여러개의 모드를 사용 할 수 있다

파일열기에 대한 성공여부를 검사하는 예

텍스트 파일을 쓰기 / 읽어서 화면에 출력하기

바이너리/텍스트 모드로 파일에 출력하는 예제

위의 코드를 이용하여 바이너리 모드 로 파일에 텍스트를 저장한 후 메모장으로 열어본 경우

바이너리 모드를 사용하여 개행문자로 "\n" 을 입력하면 아래 화면처럼 개행문자가 제대로 기능하지 못하는 것을 확인할 수 있다. 윈도우에서는 개행문자가 "\r\n" 인데 위의 코드에서는 "\n" 만 사용했기 때문에 텍스트 파일에 "\n" 만 저장되었고 메모장으로 열어보면 윈도우의 개행문자인 "\n\n" 이 없기 때문에 개행이 되지않고 깨진 문자로 보여지고 한 행에 모두 출력된다

텍스트 모드로 텍스트 파일에 저장할 때 개행문자로 위와 동일한 "\n" 을 사용했지만 메모장으로 열었을 때 개행문자가 제대로 기능하고 있는 것을 확인할 수 있다. 결국 텍스트 모드로 파일에 저장할 때 "\n"을 사용하여 개행문자를 입력하면 내부적으로 "\r\n" 으로 변환되어 저장된다는 것을 알 수 있다

바이너리 모드 로 텍스트를 파일에 저장할 때 개행문자가 제대로 입력되도록 하려면 윈도우에서는 다음과 같이 캐리지 리턴, 라인 피드(\r\n)를 모두 인덱스 바이너리 저장해야만 메모장에서도 개행문자가 제대로 기능한다. 다음과 같은 코드를 이용하면 바이너리 모드를 사용해도 제대로 개행문자를 입력할 수 있다

위와 같은 테스트를 통해서 알 수 있는 것은 텍스트 모드로 텍스트를 파일에 저장하면 " \n " 만 사용하더라도 내부에서 " \r\n " 으로 변환하여 저장해 준다는 것이다. 그러나 바이너리 모드로 " \n " 을 파일에 저장하면 그대로 " \n " 만 저장된다는 것이다

인덱스 바이너리

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

난독화와 코드 가상화 – 악성코드에 사용되는 바이너리 보호기법


악성코드 제작 및 유포 기술이 나날이 발전함에 따라, 이를 분석 및 대응하기 위한 역공학 기술 또한 복잡해져 가고 있다. 공격자는 유포지 및 명령/제어 서버(C&C) 주소를 감추고 백신 및 방화벽 등의 탐지를 피하여 피해를 지속시키기 위해 악성코드에 다양한 보호 및 난독화 기법을 적용한다. 보안분석가가 이를 분석하기 위해서는 이러한 기법을 우회하거나 무력화 해야 정상적으로 해당 멀웨어에 대한 정적 분석이 가능해 진다.

바이너리 파일의 악성 페이로드를 숨기기 위한 기법은 다음 3가지로 나뉠 수 있다.

악성 페이로드를 압축하여 저장하고 , 실행 파일이 동작할 때 동적으로 압축을 풀어 메모리에 적재하는 방식

코드의 변수 , 클래스 , 문자열 등을 해석하기 어렵게 변경 하거나 실행되지 않는 임의의 코드 (Garbage code) 를 삽입하는 등 가독성을 낮춰 분석을 지연시키는 방식

Packer 와 Obfuscator 를 혼용하며 , 추가적으로 안티 디버깅 , 분석 환경 탐지 , 코드 가상화와 등의 기법을 사용

[표 1] 바이너리 파일의 악성 페이로드를 숨기기 위한 기법 3가지

이번 호에서는 여러 가지 보호 기법 중 난독화와 코드 가상화 기술을 중심으로 해당 기법이 적용된 바이너리 분석 방법에 대해 서술하고자 한다.

예시에는 FinFisher (MD5: 4A49135D2ECC07085A8B7C5925A36C0A) 악성코드를 이용한다.

2. 난독화 (Obfuscation)

코드 난독화는 프로그램의 역공학 분석을 어렵게 하기 위해 사용되는 기법으로, 프로그램의 의미(semantics)를 유지하면서 배치(layout), 논리(logic), 자료(data), 구조(organization) 등을 변화시켜 분석가 및 자동화된 도구가 분석하기 어렵게 하는 것을 의미한다. [1 ]

C/C++로 컴파일된 바이너리의 경우 심볼 정보를 지움으로써 해당 파일을 디컴파일 했을 때 사람이 이해할 수 있는 정보를 최대한 줄일 수 있다. Java, .Net 프로그램의 경우 프로그램 수행에 심볼 정보가 필요하므로 해당 정보를 제거할 수는 없으나 클래스, 변수 이름을 변경함으로써 가독성을 낮출 수 있다.

② 필요 이상의 복잡성을 추가하거나, 실행되지 않는 코드 삽입

동일한 기능의 코드를 의도적으로 복잡하게 작성하거나 필요 없는 코드를 삽입함으로써 분석을 지연시킬 수 있다.

바이너리에 포함된 데이터를 알아보기 힘든 방식으로 인코딩/암호화하고 필요한 경우에만 디코딩/복호화하여 사용하는 방법으로 중요정보를 숨길 수 있다.

[1 ] 코드 난독화를 이용한 악성 코드 분석 기법에 관한연구, 2005, 한태숙 et al


[그림 1] FinFisher 악성코드의 코드 난독화

[그림 1]을 보면 상호 배타적인 두 가지 조건 분기문(인덱스 바이너리 ja, jbe)을 사용하여 같은 위치로 분기하는 코드를 확인할 수 있다. 해당 어셈블리는 무조건 분기문(jmp)으로 대체될 수 있는데 위와 같이 조건 분기문 두 개를 사용함으로써 분석도구가 분기문 다음에 오는 의미 없는 데이터(garbage code)를 opcode로 인식하게 하고, 이를 통해 바이너리를 비정상적으로 해석(Disassemble)하게 된다.

위의 난독화 코드를 복호화 하기 위해 아래와 같은 idapython 코드 [2] 를 이용할 수 있다.인덱스 바이너리


[2] A walk-through tutorial, with code, on statically unpacking the finspy VM, 2018, Rolf Rolles

분기문의 opcode는 다음과 같은 형식으로 나뉠 수 있다.​


Short jump의 opcode는 0x7로 시작하며, 다음 바이트가 목적지의 offset이 된다.

Near jump의 opcode는 0x0F로 시작하며, 세번째 바이트 부터 4바이트가 목적지의 offset이 된다.

위의 파이썬 코드에서 [1]과 [3]은 해당 주소의 opcode가 short/near jump인지 확인하는 내용이며,

[2]와 [4]는 두 개의 연속된 분기문이 동일한 주소를 가리킬 경우 하나의 jmp (0xEB or 0xE9) 코드로 변환하는 내용이다.

위의 파이썬 코드를 적용하면 아래와 같이 코드 흐름이 단순화 되는 것을 확인할 수 있다.

3. 코드 가상화 (Code Virtualization)

1) 코드 가상화 개요

코드 가상화란 원래의 명령어를 가상화시키고 가상화된 코드를 본체에 있는 하드웨어적인 CPU가 처리하는 것이 아니라 개발자가 만든 소프트웨어적인 핸들러가 처리하게 되는 것을 말한다. [3]

바이트 코드가 실행되는 가상 머신(VM)은 일반적으로 다음의 구조를 갖고 있다.

① Initializer는 기존의 레지스터 및 플래그 값을 스택에 저장하고 가상환경에 필요한 스택과 레지스터를 초기화하는 역할을 한다. 또한 가상환경 구동에 사용될 구조체 및 변수를 초기화 한다. Initializer로 전달되는 opcode는 일반적으로 암호화되어 있거나 압축되어 있으므로 이를 복호화하고 압축 해제하는 작업 또한 이 단계에서 이루어 진다.

② Dispatcher 단계에서는 해석된 opcode를 기반으로 각각의 기능을 수행하는 Handler로 인덱스 바이너리 코드 흐름을 분기하는 역할을 한다.

③ 각각의 Handler에서는 가상의 Instruction을 구현한다.

[3] 코드 가상화 기법이 적용된 악성코드 분석 방법 연구, 2012, 박용수 et al

2) 코드 가상화 예시

[그림 3] Virtual opcode

Finfisher 악성코드의 .text 영역 끝 부분에 위와 같이 암호화된 opcode가 저장되어 인덱스 바이너리 있는 것을 확인할 수 있다. 해당 데이터는 Initializer 단계에서 복호화되고, 복호화 된 정보들은 구조체 및 변수로 저장되어 이용된다.

[그림 4] Initializer 실행

Initializer가 호출될 때 전달되는 값은 bytecode offset을 구하기 위해 사용된다.

Initializer는 Bytecode를 복호화하고, 가상머신에서 쓰이는 구조체 및 변수를 정의한다. 해당 코드를 역분석하면 아래와 같은 구조체[4]를 사용하고 있음을 알 수 있다. 생성된 vm_context 구조체의 주소는 ebx 레지스터에 저장된다.

[4] ESET’s guide to deobfuscation and devirtualizing finfisher, 2018, Filip kafka

아래는 dispatcher에서 handler를 호출하는 코드로, vm_context 구조체(ebx)에서 handler 테이블 주소(ebx+24h)를 가져와 인덱스 값(ebx+3Ch)을 더해 해당 handler 주소를 구하고 호출하는 역할을 한다. Handler 테이블은 오른쪽 그림과 같이 확인할 수 있으며, 해당 악성코드는 34개의 handler를 갖고 있다.

[그림 5] Dispatcher 코드와 Handler 테이블

handler는 각기 다른 native instruction을 구현한다. 아래는 “JL” instruction을 구현한 handler의 내용이다.

분석가는 각 handler가 어떤 기능을 갖고 있는지 역공학을 통해 알아냄으로써 대상 악성코드의 코드가 실제로 어떤 기능을 하는지 분석할 수 있다. 아래는 분석된 Finfisher 악성코드의 Handler 테이블이다.

[Kubernetes] minikube 설치

이전 회사에서 MSA 방향성을 토대로 프로그램을 개발하였습니다. 기존 Monolithic 아키텍처에 익숙한 입장에서 불편한 느낌은 지울수가 없었습니다. 하지만 MSA 환경 구축을 위해서 k8s 환경에서 개발을 진행하다보니 장점이 많았습니다. 물론 조직의 규모가 작거나 서비스가 작다면 MSA는 맞지 않을 수 있습니다.

집에서 MSA 환경을 구축 및 실습하기 위해서 Kubernetes 를 설치하려고 하였습니다. 하지만 Kubernetes 환경을 구축하기 위해서는 마스터와 각 노드의 구조를 갖춰야 하지만 이는 로컬 환경에서 갖추기 위해서는 과하다는 생각이 많이 들었습니다. 그래서 찾아보니 Minikube 라는 것이 있었습니다. Minikube 는 로컬 환경에서 Kubernetes 환경을 쉽게 설치가 가능하며 테스트하기에도 좋습니다. 집에서 클러스터 구성을 연습하기 좋아보여서 설치를 진행하게 되었습니다.

설치를 하면서 한번에 되지는 않았습니다. 문제가 된 부분들에 대해서도 설치할때 참고를 위해서 모두 다 작성하였습니다.

사전 확인

  • CPU 2개 이상
  • 2GB의 여유 메모리
  • 20GB의 디스크 여유 공간
  • 인터넷 연결
  • 컨테이너 또는 가상 머신 관리자(예: Docker, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox 또는 VMware Fusion/Workstation)
  • Docker 설치
    • minikube에서는 minikube를 설치 및 사용하기 위한 환경으로 Docker를 가장 추천합니다.

    Docker

    먼저 설치가능한 리스트를 최신으로 업데이트합니다.

    Docker 설치를 위해서는 다음 항목이 필수로 설치되어 있어야합니다.

    • apt-transport-https : 패키지 관리자가 https를 통해 데이터 및 패키지에 접근할 수 있도록 합니다.
    • ca-certificates : ca-certificate는 certificate authority에서 발행되는 디지털 서명으로, SSL 인증서의 PEM 파일이 포함되어 있어 SSL 기반 앱이 SSL 연결이 되어있는지 확인할 수 있습니다.
    • curl : 특정 웹사이트에서 데이터를 다운로드 받을 때 사용합니다.
    • software-properties-common : 개인 패키지 저장소를 추가하거나 제거할 때 사용합니다.

    Docker의 공식 구글 클라우드의 공개 키( GPG key )를 추가합니다.

    • f : HTTP 요청 헤더의 contentType을 multipart/form-data로 전송합니다.
    • s : 진행 과정이나 에러 정보를 보여주지 않는다.(–silent)
    • S : SSL 인증과 관련있다고 들었는데, 정확히 아시는 분 있다면 댓글 부탁!
    • L : 서버에서 301, 302 응답이 오면 redirection URL로 이동합니다.
    • apt-key : apt가 패키지를 인증할 때 사용하는 키 리스트를 관리하며, 이 키를 사용해 인증된 패키지는 신뢰할 수 있는 것으로 간주합니다. add 명령어는 키 리스트에 새로운 키를 추가하겠다는 의미입니다.

    Docker를 설치하기 위한 레포지토리를 추가합니다.

    Docker 엔진과 containerd 를 설치합니다.

    Docker 설치가 잘되었는지 확인을 위해서 version을 조회해봅니다.

    Docker version은 다음과 같습니다.

    Minikube

    Minikube 설치 파일 바이너리를 다운로드 받습니다.

    다운로드 받은 바이너리 파일의 경로를 지정해줘서 설치를 마무리합니다.

    설치한 Minikube 가 정상적으로 설치되었는지 버전을 확인해봅니다.

    Minikube version은 다음과 같습니다.

    Kubectl

    Kubernetes 는 커맨드 라인 도구인 kubectl 을 사용하면 쿠버네티스 클러스터에 대해 명령을 실행할 수 있습니다.

    apt 패키지 인덱스 업데이트 및 Kubernetes 저장소를 사용하는 데 필요한 인덱스 바이너리 패키지 설치합니다.

    구글 클라우드의 공개 키( GPG key )를 추가합니다.

    Kubernetes apt 저장소를 추가합니다.

    apt 패키지 인덱스 업데이트 및 kubectl 설치합니다.

    Troubleshooting

    • kubectl 명령어 정상 실행하지 않는 경우
    • Minikuce start 되지 않는 경우 - crictl: 명령이 없습니다
    • Minikuce start 되지 않는 경우 - Exiting due to GUEST_START

    kubectl 명령어 정상 실행하지 않는 경우

    kubectl 실행시 다음과 같은 에러를 만난다면 아래 내용을 참고해서 해결할 수 있습니다

    kubectl 인덱스 바이너리 실행시 다음과 같은 에러를 만난다면 아래 내용을 참고해서 해결할 수 있습니다

    Minikuce start 되지 않는 경우 - crictl

    minikube 설치시 다음과 같은 에러를 만나다면 아래 내용을 참고해서 해결할 수 있습니다.

    Kubernetes가 컨테이너 런타임으로써의 docker 지원 중단을 발표하였고 1.20 버전부터 docker를 런타임으로 사용 할 수 없다는 경고가 표시되고 있습니다. 지원 중단을 발표한 버전 1.20 버전부터는 deprecation되며 1.22 버전부터는 deprecated 된다고 발표 되었습니다. 그래서 docker 대신 crictl를 사용할 수 있습니다.

    ETF 란 무엇인가? feat. 상장지수펀드

    ETF 란 무엇인가? feat. 상장지수펀드

    ETF 란 무엇인가? feat. 상장지수펀드

    ETF (Exchange Traded Fund 상장 지수 펀드)

    ETF의 이름을 통해서 ETF가 무엇인지 유추해봅시다.

    ETF는 Exchange Traded Fund의 앞 글자를 따서 만들었고 한국말로는 상장 지수 펀드입니다.

    상장이라는 단어의 쓰임새를 보면 주식 시장에 회사 하나가 상장했다고 표현합니다.

    예를 들어 삼성전자라는 종목이 주식시장에 상장했다고 표현합니다.

    그래서 우리는 삼성전자라는 종목을 HTS나 MTS에서 1주 살 수 있습니다.

    즉 ETF도 똑같이 주식 시장에 상장되어 있고 HTS나 MTS에서 1주씩 살 수 있습니다.

    일반 주식은 회사의 주식을 1주씩 사게 되는 것인데 ETF는 어떤 주식을 1주씩 사게 되는 것일까요?

    바로 지수와 관련된 주식을 1주씩 사게 되는 것입니다.

    그럼 지수 펀드란 무엇인지 알아볼까요?

    펀드는 많이 들어보셨을 텐데요.

    펀드는 한 종목이 아닌 여러 종목을 모아 투자했다는 뜻입니다.

    지수에 대해 흔히 어디서 쓰였는지를 떠올려 봅시다.

    KOSPI 지수, KOSDAQ 자수하면서 많이 들어보셨을 것입니다.

    그때 쓰이는 지수가 지금 얘기하려는 지수입니다.

    KOSPI에 등록된 모든 회사의 주식을 모아둔 것이 KOSPI 지수입니다.

    KOSDAQ에 등록된 모든 회사의 주식을 모아둔 것이 KOSDAQ 지수입니다.

    대충 감은 오지만 정확하게 어떤 의미인지는 잘 모르겠습니다.

    좀 더 지수에 대한 명확한 정의를 내려 보겠습니다.

    지수란 특정한 기준에 따라 모아둔 것을 의미합니다.

    예를 인덱스 바이너리 들어 헬스 케어 분야 의 회사를 모아둔 것, 전기차 분야 의 회사를 모아둔 것과 같은 것입니다.

    ETF의 장점

    그럼 ETF의 장점은 무엇일까요?

    바로 기관투자자들만 하던 투자의 방식을 개인들도 이제 쉽게 투자할 수 있게 되었다는 것입니다.

    무슨 의미인지 쉽게 들여다보겠습니다.

    ETF 란 무엇인가? feat. 상장지수펀드

    ETF 인덱스 바이너리 란 무엇인가? feat. 상장지수펀드

    전체 주식이 삼성, NAVER, 현대차, LG, 카카오로 이루어져 있다고 해봅시다.

    총 시가총액의 합은 108조 원이라고 가정해봅시다.

    ETF가 없던 시절 기관투자자들은 108조원이라는 돈을 들여 지수를 만들어 냅니다.

    그런데 ETF는 오른쪽 그림처럼 6조각으로 나누어 놓아서 18조 원이라는 금액으로 살 수 있도록 만들어 놓은 것입니다.

    모든 주식을 사지 않아도 적은 금액으로 똑같은 가격의 등락률을 갖게 됩니다.

    이런 원리로 개인이 살 수 있는 금액으로 더 잘게 쪼개져 있어서 기관들만 투자할 수 있었던 영역을 개인도 투자할 수 있게 되었습니다.


    그리고 지수를 만들기 위한 매매도 모든 주식 5개를 5번의 거래를 통해 주식을 매수 했다면 ETF는 한번의 거래로 5개의 주식을 한번에 살수 있게 되었다는 것입니다.


    그리고 주식뿐만 아니라 채권, 금, 은 농수산물과 같은 상품들도 지수로 만들어 ETF로 매매할 수 있게 되었습니다.

    이제는 개인들이 어렵게 접근해야만 하는 영역들을 주식 시장에서 쉽게 매매할 수 있게 되었습니다.

    그리고 자산 배분을 위해서는 주식이 아닌 다른 자산에 투자를 해야 합니다.

    그래야만 리스크를 줄일 수 있는데 여기에서 엄청난 공을 세우는 것이 바로 ETF입니다.

    ETF가 있기 때문에 개인들이 쉽게 채권, 금, 은, 원자재, 해외 주식에 투자할 수 있어서 분산투자가 가능해진 것입니다.

    인덱스 바이너리

    U E D R , A S I H C RSS

    Red5Install/DebianSqueeze 인덱스 바이너리 ¶

    • $
      • build.properties file
        • red5.filename=red5





        last modified 2011-03-27 12:33:59
        Processing time 0.0036 sec


0 개 댓글

답장을 남겨주세요