ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 를 접근해야겠다는 생각이 든다..

    그래도 시스템콜 부분은 흥미로웠다 ㅎㅎ

    댓글

Designed by Tistory.