리버스엔지니어링 기초

2024. 7. 15. 16:46Information Security 정보보안/정보보안 기본지식

728x90

배울내용: 

DBG

스택구조

어셈블리어

리버스엔지니어링 기초

GDB 사용법

레지스터

파일의 메모리 매핑

파일 포맷

 

 

 

 

 ELF (Executive and Linkable Format) 파일 포맷의 메모리 매핑 순서와 구조는 아래와 같다 

 

 

 

 

여기서 눈여겨 봐야할것은 아래의 스택 구조이다 

 

 

 

 

 

위에것을 이해를 해야지 디스어셈블리어를 이해할수가있다. 

위에 보는 것들의 특징을 추가적으로 요약하면 아래와 같다. 

 

 

  • 스택: 함수 호출과 관련된 데이터를 저장, 빠른 접근 속도, 고정 크기.
  • : 동적 메모리 할당, 자유로운 할당과 해제, 느린 접근 속도.
  • BSS: 초기화되지 않은 전역 변수 및 정적 변수, 프로그램 시작 시 0으로 초기화.
  • 데이터: 초기화된 전역 변수 및 정적 변수, 지정된 값으로 초기화.
  • 코드 (텍스트): 실행할 프로그램 코드, 읽기 전용.

 

 

 

 

 

 

이렇게만 봐서는 이해가 잘안되니 실제로 아래에 간단히 작성한 코드로 보자

 

코드를 보면 main 밖에 global , global2 이란 변수를 선언했고 

main 안에서는 var 를 3으로 초기화 시키고 Hello World! 를 출력하고 리턴을 한걸 볼수있다.

 

 

 

 

 

위에있는 코드를 아까보았던 파일과 메모리 매핑을 보면 위와같고 좀더 시각적으로 보면 아래와 같다 

 

 

 

 

 

이렇게 간다고 보면된다 우선 main 밖에 있는 변수는 지역변수인데 그것들은 초기화 되었는가 안되는가에 따라 또 BSS 와 DATA 에 나눠지고 , main 안에서 정의 된것은 Stack 에 들어가고  print 와 라이브러리 함수는 Code(.text) 에 저장이 되는걸 볼수있다.

 

 

 

 

 

 

 

 

레지스터 

- CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억 장치

• 범용레지스터, 인덱스 레지스터, 포인터 레지스터, 세그먼트 레지스터, 플래그 레지스터

• x64의 경우, 세그먼트 레지스터를 사용하지 않으나, 32bit 호환용으로 존재함

 

나중에 어셈블리어 코드를 보면 32 bit 인지 64 비트인지 헷갈릴수있는데 RAX 가 나오면 64 비트이다 .

EAX는 32,64비트에 들어가도 , RAX는 32 bit 에는 들어가지 못한다 

 

 

 

 

 

아래는 레지스터에서 꼭알아야할것중 하나인 연산수행, 인덱스 지정, 포인터 수행을 가리키고 그에따른 설명을 넣어놓았다.  꼭 알아야하는 필수적인 것들이다. 

 

 

 

 

 

 

 

 

어셈블리어

 

 

앞으로 레지스터용어와 같이 혼용해서 많이 쓰일 어셈블리어 관련 용어이다 . 

위에를 보면 JMP 는 JE , JNE 으로 비교를해서 특정 주소로 이동하는 것들도 있지만 여기에서는 간단하게만 넣어놨다

 

 

 

 

 

위에것을 종합으로 아래의 예시를 볼수가있다

 

 

 

 

 

 

먼저 Main 코드가 실행이 되고  call 이 되면서 func1 이라는 함수가 실행이 되고 스택에 쌓이게 된다 

 

 

 

 

 

 

그리고 func1 의 기능들이 시작이되며 아까 봤던 RSP (현재 스택을 표시하는 포인터) 가 RBP( 스택의 베이스를 가르키게 된다) ( 포인터 개념은 C 언어에서 배울수있다)   

 

 

 

 

 

 

 

그리고 RSP 에서 부터 20(16진수)  == (32bytes (10진수))   만큼 할당(초기화)된다 

 

 

 

 

 

 

 

그리고 나서 안에 스택에 코드를 쌓아주고 마지막에 leave 를 하면 다시 MOV RSP, RBP 로 처음 func1 RBP( 스택에 최상단 ) 로 이동후

POP RBP 를 하여 메인함수로 돌아올주소로 다시오게 된다.

 

 

그리고 RET (리턴) 으로 기존에 call을 종료하고 Main 코드로 다시 돌아오게 된다.

 

 

 

 

 

 

이것들은 앞으로 GDB로 확인하게 되는데

 

GDB

 

 

상단에서부터 순서대로 레지스터값, 코드및 어셈블리코드, 스택, 명령어 입력창을 볼수가있다.

 

 

 

 

 

GDB 사용법은 아래와 같다

 

 

 

 

주로 disass main 으로 간뒤에  브레이크 포인트 (b *main+0) 를 설정하고 r (시작) 을하면 

브레이크 포인트까지 실행이 되고 ni 로 한단계씩 보면서 분석을 할수가 있다.

 

 

 

 

 

기본문법을 모르겠거나 OllyDBG 또한 관심있으면 아래의 링크를 이용하길 바란다

 

https://sarimus.tistory.com/84

 

Reverse Engineering DAY_003 리버싱 위해 알아야할 것, 리버싱 기초, 리버싱 분석 방법, 정적파일 동적

배울내용: 리버싱 위해 알아야할 것 리버싱 기초 리버싱 분석 방법 정적파일 동적파일 OllyDBG 란? 디버거 도구 디버거란? OllyDBG 화면 OllyDBG 단축키 PE 파일 Reversing Engineering 리버싱 엔지니어링 기초

sarimus.tistory.com

 

 

 

 

 

추가적으로 아래의 실습문제를 통하여 좀더 자세히 이해해보자. 

728x90