어셈블리어를 사용하여
간단한 Hello World 프로그램을 작성 하려한다. 이때 사용할 수 있는 방식은 두가지 방식이 있다.
1. syscall
2. libc functions
이 두가지 방식을 이용하는 것이다. 첫번째로 syscall을 이용한 방식으로 코드를 작성 하였다.
.data 영역에는 전역변수나 정적변수, 배열 또는 구조체등이 저장된다.
초기화 된 데이터는 data 영역에 저장되고, 초기화 되지 않은 데이터는 BSS 영역에 저장되고,
또한 실행될 때 RAM 메모리에 복사된다.
.text 영역에는 코드 자체를 구성하는 메모리 영역으로 hex 파일이나 bin파일의 메모리이다.
또한 프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역이다.
code와 상수가 저장되고 수정이 불가능한 메모리 영역으로 flash memory에 복사 된다.
여기서 syscall한 함수는 바로 write함수다.
write의 파라미터를 확인하면 write(fd, buf, sizeof(buf)) 와 같이 3개의 파라미터가 들어간다.
여기서 fd는 파일 디스크립터, buf는 쓰기 할 데이터 메모리 영역, 그리고 sizeof(buf)는 쓸 데이터의 크기를 의미한다.
그리고 파라미터의 순서는 레지스터 r0, r1, r2순으로 들어간다.
_start:
mov r0 ,#1 //fd=1로 주는 값.
ldr r1, =string //buf값 (string의 메모리 영역).
ldr r2, =len //sizeof(buf)로 쓸 데이터의 크기.
mov r7, #4 //r7 레지스터에는 syscall번호가 들어가야 한다 write의 syscall 번호는 4번이다.
swi 0 //syscall을 실행.
_exit:
mov r7, #1 // exit의 syscall 번호는 1이다.
swi 0 //syscall을 실행.
.s는 어셈블리 소스 파일의 확장자이다.
as -o file.o file.s 명령어를 통해 .s 소스 파일을 오브젝트 파일인 .o로 어셈블 시켜줘야 한다.
여기서 오브젝트 파일 .o 파일은 2진수로 이루어진 기계어로 된 파일이다.
오브젝트 파일을 이용하여 ld -o file file.o 명령어를 통해 실행 파일로 링크 시켜준다.
전 과정을 보면
.c(c언어 소스코드)---->.s(어셈블리 소스코드)---->.o(오브젝트 파일)---->.exe(실행파일)
| | |
컴파일 어셈블리 컴파일 링크
하지만 .s 파일을 gcc로 컴파일 하면 에러가 발생한다.
그 이유는 .s 파일에는 main 함수가 없기 때문이다.
이제 rasp_syscall 실행파일을 gdb로 분석해 보자
gdb -q ./rasp_syscall를 실행한 모습이다. gdb에 들어가서 info files을 하면 .text 섹션의 주소와 .data 섹션의 주소를 알 수 있다.
0x00010074-0x00010094: .text 섹션
0x00020094-0x000200a2: .data 섹션
소스코드가 있는 섹션인 .text 섹션에 break를 걸어보자.
0x10074부터 .s파일을 작성 만들때 보이는 명령어들이 보인다.
여기서 0x10078에 보이는 명령어는 ldr r1, [0x10090]이 된다.
여기서 [0x10090]의 의미는 0x10090의 주소가 가리키는 값을 의미한다.
0x10090의 주소가 가리키는 값을 r1 레지스터에 넣으라는 의미가 된다.
그럼 0x10090의 주소가 가리키는 값에는 어떤 값이 저장되어 있을까?
[0x10090]에 저장된 값이 궁금하면 다음과 같은 gdb 명령어로 확인할 수 있다.
x/x 0x10090 결과 0x10090의 주소가 가리키는 값은 0x00020094를 가리킨다.
따라서 r1의 값에는 0x20094가 저장 된다는 것을 알았다.
그리고 이 0x20094의 주소가 가리키는 값에는 "Hello world!" 문자열이 존재하는것을 알 수 있다.
여기서 쓰인 *(int*)0x10090의 의미는
(int*)0x10090=0x10090의 주소가 가리키는 값(0x20094)
*(int*)0x10090=0x10090의 주소가 가리키는 값의 주소가 가리키는 값(*0x20094)="H"
'ARM아키텍쳐' 카테고리의 다른 글
[ARM] ROPlevel1 (0) | 2020.05.04 |
---|---|
[ARM] exploit RTL Chaining (0) | 2020.03.25 |
[ARM] Hello World!_Part 2 (0) | 2020.01.13 |
[ARM] exploit_RTL (0) | 2019.12.22 |
[ARM] exploit_ROP (0) | 2019.12.22 |