본문 바로가기

2. Reversing (리버싱)

[2024.09.21] 리버씽씽이_1주차 활동

 

1주차에는 유튜브 리버싱 강의를 1강~3강까지 학습하였다.

 

https://youtube.com/playlist?list=PLY12b4RRLcSdsxgVvTW3mnNzMjVrd8JhO&si=gihRwDoT8ATLvdeZ

 

리버싱 강의

리버싱에 대해 공부합시다.

www.youtube.com

 

 

 

 

리버싱(역공학)=RE(Revese Engineering) =RCE(Reverse Code Engineering)

         공학: 어떠한 물건을 만드는 것

         역공학: 제품을 어떤 방식으로 만들었는지 확인하여 설계도를 제작하는 것. 공학과는 반대 방향

 

 

리버싱 분석방법

1. 정적 분석

       : 파일을 실행하지 않고 분석하는 방법

            파일의 겉모습을 분석

       - 정적 프로그램

            IDA : 정적과 동적 둘 다 가능

 

2. 동적 분석

       : 파일을 실행하고 분석하는 방법

            파일 깊이 들어가서 분석하고 관찰 -> 파일의 리턴값을 알 수 있음

        - 동적 프로그램

            Cheat Engine, Ollydbg, x64dbg

 

 

리버싱에서 사용하는 프로그래밍 언어

      Assembly 언어(기계어를 사람이 읽기 쉽게 만든 것), C 언어

      소스코드 : printf(“”), Hex code : 16진수, Assembly code

 

패치/크랙

      패치: 프로세스의 메모리를 변경하는 것

      크랙: 패치와 비슷, 불법적(비도덕적)인 메모리 수정

 

 

 

<Hello World 분석>

프로그램 빌드     

        : 전처리 – 컴파일 – 어셈블 – 링크

 

디스어셈블리

        :  기계어를 사람이 알아보기 쉽게 어셈블리 코드로 바꿔줌

          어셈블리 언어는 CPU마다 다름, CPU에 종속 (amd, intel ..)

 

X64dbg 인터페이스: HEX 덤프 창, 스택, 레지스터 창, 기계어 코드와 어셈블리어 코드

          

 

X64dbg 주요 키와 기능

      F2: 중단점(breakpoint) 설정

      F8: 한줄실행

      space: 코드를 수정

      함수를 호출하기 전에 문자열을 가져옴, 주소값이 문자열을 나타낸다.

      ctrl+g: 원하는 주소로 가기

      F9: breakpoint 위치로 가기

      F7: 함수 내부로 들어가기

 

 

디버깅의 목표

Hello World 실행 파일을 디버깅하여 어셈블리 언어로 변환. main 함수를 찾아보고 이 과정을 통해서 기본적인 디버거의 사용방법과 어셈블리 명령어를 알아보기

MessageBox 함수(출처: https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-messagebox)

: 간단한 애플리케이션 관련 메시지가 포함된 모달 대화 상자를 표시함

   

   첫 번째 인자: NULL이므로 메시지 소유자 창이 없음

   두 번째 인자: 표시할 메시지

   세 번째 인자: 대화 상자 제목

   네 번째 인자: 대화 상자의 내용 및 동작, MB_OK는 메시지 상자에는 확인이라는 하나의 푸시 단추가 포함됨을 의미

 

 

실습

 

1.    x64dbg 설치

2.    사전에 작성한 c언어 코드 파일(분석하고자 하는 파일)을 x64dbg에서 실행

3.    단축키 활용하여 의심스러운 부분 캐치(ex. Main 함수에 들어있는 코드 실행시 특이사항, main 함수 파악 등)

             →  어떠한 줄에서 체크박스 등 특이 사항이 실행될 경우 그 라인이 main 함수일 가능성이 있음

main 함수를 찾고 문자열 주소를 변경하여 메모리 변조를 할 수 있었음

 

 

 

<바이트 오더링>

바이트 오더링: 컴퓨터에서 메모리에 데이터를 저장하는 방식

 

          Big Endian        Little Endian

Byte 1    [12]                      [12]

Word 2   [12][34]                [34][12]

Dword 4  [12][34][56][78]     [78][56][34][12]

char[] 4   [12][12][12][00]     [12][12][12][00]

 

 

바이트 오더링 종류

1. 빅 엔디안(Big Endian): 순서대로 저장

    장점: 사람이 보기에 직관적

    단점: Window의 intel cpu에서 사용하지 않음, 서버용 cpu에서 사용됨

 

2. 리틀 엔디안(Little Endian): 역순 저장, 예외로 1byte, str(문자)은 정방향으로 저장.

                                      멀티바이트(word, dword)만 역순으로 저장

    장점: Window에서 사용됨, 데이터를 효율적으로 저장 가능

    단점: 사람이 보기에 어려움

 

 

실습

X64dbg를 사용하여 main 함수를 찾고 리틀 엔디안 방식으로 저장된 것을 HEX 덤프 창에서 확인함.