본문 바로가기

공부/보안

[dreamhack] System Exploitation 6강 - ELF 동적 분석

반응형

6강 Linux Exploitation & Mitigation Part 1

6.1 ELF 동적 분석

바이너리를 분석할 때, 바이너리가 실행되며 변화하는 상태를 보기 위해 동적 디버깅이 필요하다. 때문에 리눅스 실행 파일인 ELF 파일을 동적으로 디버깅하는 방법을 알아야한다.

 

ELF의 동적 분석을 위한 도구gdb, strace, Itrace, IDA가 있고, 이 중 ELF 디버거인 gdb(GNU Debugger)는 AT&Tintel 두 종류가 있다.

 

널리 쓰이는 디스어셈블리 문법은 intel이다.

 

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(void){
  int sum = 0;
  int val1 = 1;
  int val2 = 2;
  sum = val1 + val2;
  printf("1 + 2 = %d\n", sum);
  return 0;
}
cs

위 코드는 1과 2의 덧셈을 출력하는 예제이다.

커맨드 라인 기반으로 동작하는 디버거인 gdb에서 함수의 디스어셈블리 결과를 출력해주는 명령어인 disassemble 을 사용해 main 함수의 디스어셈블리 결과를 보았다.

0x8048439 주소에 브레이크포인트를 설정해 val1 + val2 의 결과값이 저장된 eax 레지스터의 값을 볼 수 있다.

 

브레이크 포인터를 설정하는 명령어는 break혹은 bp 로 값은 *[주소] 혹은 *[함수]+[몇번째] 로 설정할 수 있다. 브레이크 포인터의 출력은 bl이다.

 

프로세스를 실행시켜 주는 명령어인 run(r)을 이용해 브레이크포인터가 설정된 지점까지 실행시킨다. eip 레지스터가 0x8048439로 브레이크 포인터를 설정했던 위치서 실행이 멈춘 것을 확인할 수 있다.

 

레지스터나 변수의 값을 출력해주는 print (p)명령어를 이용해 val1 + val2 의 결과가 저장되어 있는 eax 레지스터의 값을 출력해보면 3이 저장되어 있는 것을 확인 할 수 있다.

0x8048439 주소에 브레이크포인트를 설정해 printf 함수의 인자들을 볼 수 있다.

프로세스가 멈추어있는 상태에서 프로세스를 이어서 실행시켜 주는 명령어는 continue (c) 이다. (브레이크포인트가 설정되어 있다면 다음 브레이크포인트 지점까지 프로세스를 실행시킨다.)

 

스택 메모리를 보기위해서 인자로 주어진 주소의 메모리를 볼 수 있는 x 명령어를 사용한다.

 

x 명령어는 출력 타입을 지정해줄 수 있는데, 우선 esp 레지스터의 메모리를 word 타입으로 2개 출력해볼 수 있다. (x/2wx)

 

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

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

함수의 다음 인스트런션을 실행해주는 nexti (ni) 명령어를 이용해 printf 함수를 실행해보면 "1 + 2 = 3" 문자열이 출력된 것을 확인할 수 있다.

 

나 보려고 따로 정리해둔 gdb 명령어

반응형