'한빛아카데미 - 시스템 해킹과 보안' 교재에 관한 내용입니다.


• 실습 환경

-> putty로 연결한 레드햇 리눅스 6.2

 

 sample.c 의 어셈블리어 코드 획득하기

putty로 연결한 레드햇 리눅스 커널창에 명령어를 입력합니다.

vi sample.c

 

vi sample.c 를 실행하면 빈화면이 나오는데 aa를 입력하여 INSERT 설정으로 변경 후 아래 코드를 입력합니다.

void main(){
	int c;
    c = function(1, 2);
}

int function(int a, int b){
	char buffer[0]'
    a = a + b;
    return a;
}

입력 한 후 Esc 클릭하고 :wq 를 입력하면 저장후 편집기를 빠져나옵니다.

 

gcc 명령어로 sample.c 파일을 sample.c 파일로 컴파일하고, sample.a 파일을 vi 편집기로 확인합니다.

gcc -S -o sample.a sample.c
vi sample.a

sample.c 파일의 어셈블리 코드입니다.

 

 쉘 기본 코드 분석

1 | pushl %ebp

- 최초의 프레임 포인터(ebp) 값을 스택에 저장

 ebp:스택의 바닥을 가리킴

- ebp 바로 전에는 ret가 저장된다

ret(return address)에는 함수 종료 시 점프할 주소 값을 저장

- ebp는 함수 시작 전의 기준점

- 스택에 저장된 ebp를 SFP(Saved Frame Pointer)라고도 함

2 |  movl %esp, %ebp

3 | subl $4, %esp

- esp에서 4바이트 만큼 뺀다

- 즉, 스택에 4바이트만큼의 용량을 할당

- 이는 int c 를 위한 공간 할당 작업

 

4 ~ 6 | 세 단계는 function(1, 2)에 대한 코드

4 | pushl $2

5 | pushl $1

6 | call function

 

7 | pushl %ebp : 현재 ebp 값을 스택에 저장

 

8 | movl %esp,%ebp

- function(1, 2)의 시작에서도 pushl %ebp 명령과 movl %esp,%ebp이 실행 됨

9 | subl $12,%esp

- char buffer[10]를 위한 공간 할당

- 스택에 12바이트만큼 용량을 할당

- 공간 할당은 4바이트 단위로 작업

10 | movl 12(%ebp), %eax

- ebp에 12바이트를 더한 주소 값의 내용(정수 2)을 eax 값에 복사

 

11 | addl %eax, 8(%ebp)

- ebp에 8바이트를 더한 주소 값의 내용인 정수 1과 eax에 저장되어 있는 정수2를 더한다

 

12 | movl 8(%ebp), %edx

- ebp에 8바이트 더한 주소 값의 내용(정수3)을 edx에 저장

 

13 | movl %edx,%eax

- edx에 저장된 정수 3을 eax로 복사

 

14 | jmp .L2

- L2로 점프

 

15 | leave

- 함수 종료

 

16 | ret

- function 함수를 마치고 function 함수에서 저장된 ebp 값을 제거 main 함수의 원래 ebp 값으로 EBP 레지스터 값 변경

 

17 | addl $8, %esp : esp에 8바이트를 더한다

 

18 | movl %eax, %eax

- eax 값을 eax로 복사(사실상 의미없음)

 

19 | movl %eax, -4(%ebp)

- ebp에서 4바이트를 뺀 주소 값(int c)에 eax 값을 복사

 

20 | leave

 

21 | ret

 

- 시스템을 공격할 때 셸 코드를 스택에 업로드해서 사용하는데, 코드는 스택에서 직접 실행될 수 있도록 기계어로 바꾸어 사용

+ Recent posts