본문 바로가기

2. Reversing (리버싱)/1) Write UP

[2024.03.16] 리버씽씽카 1주차 활동

리버싱 스터디 1주차에서는 유튜브 영상을 활용해 리버싱 기초 지식을 습득했다.
1-3강을 듣고 내용을 정리한 후 어려웠던 부분은 질문을 통해 해결하는 시간을 가졌다.

참고한 유튜브 영상은 아래와 같다.

https://www.youtube.com/playlist?list=PLY12b4RRLcSdsxgVvTW3mnNzMjVrd8JhO

 

리버싱 강의

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

www.youtube.com

 

리버싱(Reversing)이란?

 

리버싱은 역공학이자 역방향이다.

  • 역공학(Reverse Engineering) : 이미 만들어진 소프트웨어 시스템을 역으로 추척하여 처음의 문서나 설계기법 등의 자료를 얻어내는 것
  • 순공학(Forward Engineering) : 어떠한 물건을 만드는 것

이때, RE(Reverse Engineering) = RCE(Reverse Code Engineering)이다.

 

리버싱 분석 방법

 

리버싱 분석 방법은 정적분석과 동적분석으로 크게 2가지가 존재한다.

  1. 정적분석(Static Analysis) : 파일을 실행하지 않고 분석, 파일의 겉모습 분석. 예) IDA (동적도 가능)
  2. 동적분석(Dynamic Analysis) : 파일을 실행하고 분석, 파일 깊이 들어가서 분석 및 관찰. 예) Cheat Engine, Ollydbg, x64dbg

어셈블리어(Assembly Language) 

기계어와 일대일로 대응되는 언어

 

코드의 종류

  1. 소스코드                              예) printf("Hello World");
  2. Hex(16진수) code                예) 43 46 44 43
  3. assembly code                     예) mov eax, ebx / add1
패치와 크랙

 

패치 : 프로세스의 메모리 변경. 예) Window 업데이트, 게임 업데이트

크랙 : 패치와 비슷하나 비도덕적이고 불법적인 메모리 수정. 예) 게임 핵 

 

빌드의 과정

소스코드 -> preprocessing(전처리) -> compilation(컴파일) -> assemble(어셈블) -> linking(링크) -> 실행가능한 파일

빌드의 원리

이때, 빌드의 반대는 디스어셈블리(기계어를 사람이 알아보기 쉽게 번역)이다.

 

dbg 포인트

EP(Entry Point) : CPU에서 가장 먼저 시작되는 부분

BP(Break Point) : 프로세스를 일시적으로 중단하는 부분 

 

x64dbg 단축키

F2 : BP 설정

F7 : 함수 내부로 이동

F8 : 한줄 실행

F9 : 브레이크 포인트 이동

Space bar : 어셈블리 코드 수정

Ctrl+G : 원하는 주소로 이동하는 goto문

 


 

Hello World 분석

 

Visual Studio 2022를 사용해 간단한 코드를 작성했다.

Hello World 코드
Hello World 코드 실행 결과 (사진 1)

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

x64dbg를 사용하여 Hello World 실행파일을 디버깅하면 다음과 같이 일시중지된 파일이 보인다.

 

F8을 누르며 사진 1과 같은 메시지 박스가 뜨는 곳을 찾아 jmp 부분을 눌러가며 main함수를 찾아본다.

main함수 발견

이때, 작성했던 코드인 Reverse start와 Hello World가 있는 것으로 보아 main함수를 찾았음을 알 수 있다.

 

추가로 Reverse start 부분을 space bar를 눌러 주소 부분을 복사 한 뒤, Hello World의 주소에 붙여넣기 하면 아까와 달리 Reverse start가 메시지 박스로 뜨는 것을 볼 수 있다.

사진 1에서 바뀐 모습

이를 통해 문자열을 가져올 때 형태가 중요하다는 것을 알 수 있으며 주소값이 문자열임을 알 수 있다.

 


 

바이트 오더링(Byte Ordering)

컴퓨터에서 메모리에 데이터를 저장하는 방식

  1. 빅 엔디안(Big Endian) : 모든 데이터를 순서대로 저장한다. 사람이 보기에 직관적이나 Window의 Intel cpu에서는 사용할 수 없다. (서버용 CPU에서 사용됨)
  2. 리틀 엔디안(Little Endian) : 멀티바이트만 역순으로 저장한다. 사람이 보기에 직관적이지 않지만 Window에 사용되고 데이터를 효율적으로 저장할 수 있다.
  name byte    
      빅 엔디안 리틀 엔디안
byte a 1 [12] [12]
word b 2 [12][34] [34][12]
dword ab 4 [12][34][56][78] [78][56][34][12]
char[] str 4 [12][12][12][00] [12][12][12][00]

 

리틀 엔디안 디버깅 실습

 

코드는 다음과 같다. (6번째 줄의 0x12는 16진수 12를 뜻한다. 16번째 줄에서는 포인터를 사용하지 않으면 에러가 발생한다.)

Visual Stuido 2022 사용

  • 목표 : 리틀 엔디안의 저장방식을 관찰하고 이해하자.

앞서 진행한 Hello World와 같이 일시중지된 실행파일에서 메시지 박스가 뜨는 부분을 찾는다. 그 후 jmp를 통해 main함수를 찾아준다.

작성했던 코드가 보이는 것으로 보아 main함수 발견
리틀 엔디안 방식 확인을 위한 주소

 

보이는 주소를 복사한 후 16진수로 표현된 Hex code에 ctrl+G를 눌러 붙여넣기한다.

리틀 엔디안 저장방식 확인

12 34가 역순으로 저장된 것을 확인할 수 있다.