본문 바로가기

ETC/EVI$ION

EVI$ION 7기 정규 세션 과제 - pwnable 1주차

Pwnable

pwnable은 시스템 해킹의 다른 말로 운영체제나 소프트웨어, 하드웨어에 내재된 보안 취약점을 해킹하는 것이다. 보안 취약점을 해킹하기 위해서 여러 가지 공격 기법을 활용해 관리자 자격을 뺏어 시스템의 관리자 권한을 탈취한다.

 

Shell

shell은 명령어와 커널이 대화할 수 있게 도와주는 인터페이스이다.
유저가 shell에 명령을 전달하면 shell이 커널에게 부탁하고, 커널이 내부적인 작업을 한 후 결과를 다시 shell을 통해서 유저에게 전달한다.

 

Architecture & Register

[명령어 집합 구조(ISA)] CPU가 해석하는 명령어의 집합. SA는 IA-32, x86-64(x64), MIPS, AVR 등 다양하게 존재한다.

[n비트 아키텍처] ‘64비트 아키텍처', '32비트 아키텍처’에서 64와 32는 CPU가 한번에 처리할 수 있는 데이터의 크기.
WORD : CPU가 이해할 수 있는 데이터의 단위라는 의미,

[ 레지스터 ] CPU가 데이터를 빠르게 저장하고 사용할 때 이용, 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용되는 보관소.

  • x64 아키텍처에는 범용 레지스터(General Register), 세그먼트 레지스터(Segment Register), 명령어 포인터 레지스터(Instruction Pointer Register, IP), 플래그 레지스터(Flag Register)가 존재

[범용 레지스터] CPU 내부에 있는 레지스터들 중에 계산 결과의 임시 저장, 산술 및 논리 연산 따위가 같이 여러 가지 목적으로 사용될 수 있는 레지스터.

 

Linux Memory Layout

프로그램이 실행될 시 효율적인 메모리 사용을 위해 할당하는 메모리를 용도별로 나눈다.Linux 메모리 구조에서는 코드 세그먼트, 데이터 세그먼트, BSS 세그먼트,힙 세그먼트, 스택 세그먼트, 이렇게 총 5가지의 세그먼트로 구분되어있다.


① 코드 세그먼트

  • 프로그램에서 실행 가능한 코드 데이터가 위치

② 데이터 세그먼트

  • 값이 정해지는 전역 변수나 전역 상수 데이터가 위치

③ BSS 세그먼트

  • 값이 정해지지 않는 전역 변수가 위치

④ 힙 세그먼트

  • 동적으로 할당받는 메모리가 위치

⑤ 스택 세그먼트

  • 프로세스에서 사용하는 스택이 위치

 

Calling Convention

: 함수 호출을 처리할 때 caller와 callee 사이 상호작용을 함수 호출규약

[ Stack Frame ] 함수가 호출될 때, 그 함수만의 스택 영역을 구분하기 위하여 생성되는 공간. 이 공간에는 함수와 관계되는 지역 번수, 매개변수가 저장되며, 함수 호출 시 할당되며, 함수가 종료되면서 소멸한다.

cdecl

: x86 architecture는 cdecl이라는 calling convention을 사용

cdecl 함수 호출 처리 순서
1. caller가 전달할 argument를 stack에 push
2. callee prolog
3. callee epilog
4. caller가 call과정에서 사용한 stack 정리

sysv

: x64 architecture는 sysv이라는 calling convention을 사용

sysv 함수 호출 처리 순서
1. 6개의 인자를 RDI, RSI, RDX, RCX, R8, R9에 순서대로 저장하여 전달.
더 많은 인자를 사용해야 할 때는 스택을 추가로 이용
2. callee prolog
3. callee epilog
4. caller에서 인자 전달에 사용된 스택을 정리.
5. 함수의 반환 값은 RAX로 전달