-
Hello world 를 파헤쳐보자!끄적끄적 2019. 6. 6. 23:34
1. 시스템 호출 과정
출처 : https://slidesplayer.org/slide/15442845/
우선 " int 0x80 " 에 대해 이해해보자.
i) INT : x86 중앙 처리 장치를 위한 어셈블리어, 인터럽트를 발생시킴
ii) IDT 에서 0x80 위치에 있는 system_call( ) 을 발생시킴
인터럽트 디스크립터 테이블 (Interrupt Descriptor Table (IDT))은 인터럽트 벡터 테이블을 구현하기 위해 X86 아키텍처에서 사용되는 데이터 구조체이다.
IDT는 프로세서가 인터럽트와 예외에 대한 정확한 반응을 결정하기 위해 사용된다. ( https://ko.wikipedia.org/wiki/ )
2. System_call( ) 작동의 이해
출처 : http://shell-storm.org/shellcode/files/syscalls.html
system call 이 발생되었을 때, 레지스터 상태에 따라 다른 함수로 처리된다.
따라서 레지스터의 상태를 맞춰준 뒤, system_call 을 해주었을 때 원하는 함수를 실행 할 수 있다.
3. 'Hello world' 출력 시 레지스터 값 예상
출력 기능을 하는 sys_write 에 주목하도록 한다.
sys_write 의 사용을 위해서 EAX : 4 , EBX : fd(1, 표준출력) , ECX : 출력문, EDX : size 의 포맷을 맞춰주어야 한다.
4. 확인하기
1. Hello world 에 대한 정확한 이해를 위해 다음과 같은 형식의 파일을 만들었다. (asm.c)
int main( ){ write(1, "Hello world", 12 ); }
2. 'gcc -o asm asm.c' 을 통해 컴파일을 해주었다.
3. 'gdb -q asm' 으로 함수의 내용을 확인해보자.
asm 의 main 함수의 내부이다. 인자로 3 개의 값을 PUSH 하는 것을 알 수 있다.
write 함수로 들어가보면 다음과 같은 코드들을 볼 수 있는데!!
위에서 예상한 값 : sys_write 의 사용을 위해서 EAX : 4 , EBX : fd(1, 표준출력) , ECX : 출력문, EDX : size 의 포맷을 맞춰주어야 한다.
ebx + 8 위치 ( 마지막으로 넣어준 인자 : 1 )
ebx + 12 위치 ( 두 번째로 넣어준 인자 : Hello world 문자열의 주소 )
ebx + 16 위치 ( 첫 번쨰로 넣어준 인자 : 12 )
mov eax, 4
가 예상했던 곳으로 들어가는 것을 확인할 수 있다.
그 뒤, int 0x80 을 통해서 system_call 을 하는 것을 볼 수 있다.
5. 어셈블리어 코딩
우분투 환경에서 작성했습니다.
0. sudo apt-get install nasm 을 통해 nasm 을 설치해줍니다.
1. 우선 test.asm 파일을 생성하여 다음과 같이 코딩해줍니다. text 부는 위에서 예측한 레지스터 값으로 넣었습니다.
0x0A 는 줄바꿈은 줄바꿈을 의미합니다. _start 를 main 으로 생각하시면 됩니다.
2. 'nasm -f elf64 test.asm -o test.o' 를 통해 오브젝트 파일을 생성해줍니다.
3. 'ld test.o -o test' 를 통해 실행파일로 만들어줍니다.
4. 어셈블리어로부터 생성한 파일을 실행해봅시다!
5. gdb 를 사용해서 코드를 확인해봅시다.
일단 비슷하게 따라해본 거 같은데, 아직 원하는 형태의 shell code 에 접근하지는 못한 듯 하다.
하.. 오늘도 기본 개념의 중요성을 깨닫게 되는 하루인 것 같다
32 비트 64 비트 체제에 입각해서 shellcode 를 접근해야겠다는 생각이 든다..
그래도 시스템콜 부분은 흥미로웠다 ㅎㅎ
'끄적끄적' 카테고리의 다른 글
정보보안 인력양성 프로젝트 6주차 강의 완료!! (0) 2019.06.23 BOB 면접 후기 (4) 2019.06.16 제주 정보보안 인력양성 교육대상자 (0) 2019.05.16 제주 정보보안 인력양성 프로젝트 참여방법 (0) 2019.05.12 가즈아 ~ (2) 2019.05.06 댓글