'한빛아카데미 - 시스템 해킹과 보안' 교재에 관한 내용입니다.
• 실습 환경
-> 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
- 시스템을 공격할 때 셸 코드를 스택에 업로드해서 사용하는데, 코드는 스택에서 직접 실행될 수 있도록 기계어로 바꾸어 사용
'System > Hacking and Security' 카테고리의 다른 글
시스템 해킹과 보안 - 어셈블리어의 기본 문법과 명령 2 (0) | 2022.09.27 |
---|---|
시스템 해킹과 보안 - 어셈블리어의 기본 문법과 명령 1 (0) | 2022.09.27 |
시스템 해킹과 보안 - 80×86 시스템 CPU와 레지스터 (0) | 2022.09.27 |
시스템 해킹과 보안 - 운영체제 (0) | 2022.09.27 |