관리 메뉴

개발자비행일지

모의해킹 시스템해킹 리눅스 ELF 동적분석1 본문

▶ 모의해킹 공부

모의해킹 시스템해킹 리눅스 ELF 동적분석1

Cyber0946 2020. 2. 20. 10:51

이 글은 아래 사이트의 강좌를 듣고 개인 학습을 위해 정리한 내용입니다. 

https://dreamhack.io/learn/2

ELF 동적분석

Introduction

바이너리를 분석할 때, 바이너리가 실행되며 변화하는 상태를 관찰하기 위해 동적 디버깅을 수행한다. 이때, 리눅스의 실행파일인 ELF파일을 동적으로 디버깅 하여 바이너리 공격기법을 익히고 실습할 수 있도록 해 본다. 

이러한 ELF를 동적으로 분석하는 도구로는 gdb, strace, Itrace, IDA 등이 있다. 이 글에서는 가장 유명한 ELF 디버거인 gdb를 사용하여 ELF 라이브러리를 디버깅 하는 방법에 대해 정리 해 본다. 

gdb에서 제공하는 디스어셈블러 문법은 AT&T와 intel 두 종류가 있다. 이 중 널리 쓰이는 문법은 intel이다. gdb 실행시 마다 매번 설정하는 번거로움을 덜기 위해 gdb의 기본문법을 intel로 변경하도록 한다. 

.gdbinit은 gdb 시작시 자동으로 실행할 gdb 명령들을 저장한 설정 파일이다. 

우리는 다음의 명령을 통해서 gdb 디스어셈블리 문법을 intel로 기본석정 한다. 

$ echo "set disassembly-flavor intel" >> ~/.gdbinit

설정이 잘되어 있는지 확인해 보도록 한다. 

자 이제 example0.c 라는 간단한 예제를 gdb를 통해 분석해 보도록 한다. 
분석할 예제는 아래와 같다. vim을 사용해서 c코드를 작성한다.

 

이제 실행파일을 빌드한다. 

실행은 ./example0으로 하며, 아래 1+2=3 이 출력된걸로 보아 정상작동함을 알 수 있다. 

자 이제 분석을 시작해 보자. 

gdb에 우리가 생성한 실행파일을 전달해주어 gdb에 디스어셈블 대상을 준다. 

gdb ./example0으로 가능하다. 

정상작동한 화면이다. 

메인 함수를 다음의 명령으로 디스어셈블하면 c로 작성한 코드의 어셈블리어를 확인 가능하다.

여기서  변수에 값을 저장하고 더하기를 반환하는 부분은 위 그림과 같이 매핑 된다.

이를 통해서 우리는 eax에 val1+val2 의 결과 값이 저장되는 걸 알 수 있다. 

해당 주소는 0ㅌ08048439에 브레이크포인트를 설정해서 살펴 볼 수 있다. 

gdb에서 브레이크 포인트를 설정하는 명령어는 break 또는 b 이다.

 해당 영역에 break를 걸어 준다. breakpoint 정보는 info b 명령어로 확인된다.

이때, 브레이크 포인트 해제 멸영어는

delete NUM(브레이크포인트 숫자) 이다.

자 이제 r 명령을 통해 실행 시켜 보자, run도 가능하다.

현재의 시점의 레지스터 값을 i r 명령어 또는 info regi 로 확인 가능하다.

다음 명령어를 통해 eax에 3이 저장되어 있는 것을 알 수 있다. 

자 이제 printf 함수를 분석해 보자, 함수의 인자가 무엇인지 알아 보도록 하겠다. 이때 x 명령어를 사용하면 인자로 주어진 주소의 메모리를 알 수 있다. 

먼저 pritf 호출 명령에 b명령어로 브레이크 포인트를 걸고 , c명령어를 통해서 실행을 이어서 한다. 

자 이제 x 명령어를 통해 인자로 주어진 주소의 메모리를 볼 수 있는데  출력 타입 지정을 통해 esp 레지스터의 메모리를 word 타입으로 2개만큼 출력해 보자. 

x86 아키텍처의 호출 규약에 의해, printf 함수가 호출되는 시점의 스택 메모리에 함수의 인자들이 순서대로 저장되어 있는 것을 볼 수 있다.

첫 번째 인자인 1 + 2 = %d\n 문자열의 주소 0x80484d0을 문자열 형태로(x/s) 출력해본다. 

자 이제 printf 함수를 실행시켜 보자 이는 ni(next instrucion)으로 실행 가능하다.