강의 내용 정리
Pwnable(시스템 해킹)
- 권한을 자기 것으로 만든다는 의미
- 원래 권한을 자기 것으로 만든다는 의미에서 ownable이 정식 명칙이지만, 대회 당시 오타로 pwnable이라고 입력했던 것에서 유래
- 운영체제 또는 프로그램 취약점을 찾아 공격하고, 관리자의 권한 등을 얻어 시스템 을 장악하거나 의도치 않은 행동을 하게 하는 것
- 컴퓨터 프로그램의 행위를 조작하여 공격자가 원하는 행동을 실행하도록 하는 공격
포너블을 통해서 궁극적으로 하는 일 → 관리자 권한 탈취
- 과정
- 프로그램상의 취약점을 발견
- 취약점을 기반으로 공격 시나리오를 작성
- 공격 시나리오를 기반으로 하여 필요한 정보를 수집하고, 공격 (그 과정에서 메모리 구조 분석 등이 필수)
- 공격을 성공시키고, 권한 탈취 원하는 정보 알아내기
- 리눅스 환경에서 Exploit(공격)을 보다 편리하게 할 수 있게 여러가지 함수와 기능을 제공하는 파이썬 라이브러리
- 주로 해킹 대회에서 사용되며, 네트워크/프로세스와 편리하게 데이터를 주고 받게 해줌
- CTF 프레임워크 및 익스플로잇 개발 라이브러리
- 신속한 프로토타이핑 및 개발을 위해 설계
- 익스플로잇 작성을 가능한 간단하게 만들기 위한 것
공식 Github 주소 : [https://github.com/Gallopsled/pwntools]
공식 문서 주소 : [http://docs.pwntools.com/en/stable/]
- 사용방법
-
remote
원격 서비스에 접속하여 통신할 때 사용
-
process
로컬 프로세스를 실행하여 통신할 때 사용되는 클래스
-
ssh
서버에 접속하여 통신할 때 사용되는 클래스
-
send
연결이 맺어진 객체에 데이터를 보내는 메소드
-
sendline
연결이 맺어진 객체에 개행(In)을 포함하는 데이터를 보내는 메소드
-
sendafter
원하는 문자 혹은 문자열까지 읽은 뒤 데이터를 보내는 함수
-
sendlineafter
원하는 문자 혹은 문자열까지 읽은 뒤 개행을 포함하는 데이터를 보냄
-
recv
연결이 맺어진 객체로부터 수신한 데이터를 리턴하는 메소드
-
recvline
연결이 맺어진 객체로부터 개행까지 수신하여 리턴하는 메소드
-
recvuntil
연결이 맺어진 객체에서 원하는 문제 혹은 문자열까지 읽는 메소드
-
p32
32비트 리틀 엔디안 방식으로 패킹해주는 함수
Shellcode
시스템의 특징 명령(Shell)을 실행하는 작은 사이즈의 프로그램 일반적으로 기계어로 작성
메모리에 shellcode를 올리면 바로 명령어가 실행됨
- Shellcode의 사용
- 주로 Buffer Over Flow(BOF), Format Bug(FSB) 공격에서 사용
- 메모리에 쉘코드를 올리고 Return Address를 쉘코드가 저장된 메모리의 주소로 덮어 씌우면 쉘이 실행됨
Buffer Overflow(=Buffer Overrun)
- Buffer
지정된 크기의 메모리 공간
- Stack Buffer Overflow
스택에 위치한 버퍼에 할당된 것보다 더 많은 데이터를 쓸 때 발생하며, 함수의 return 주소를 조작하는 것이 일반적
- Heap Buffer Overflow
동적 메모리 할당 연결을 덮어써 프로그램의 함수 포인터 조작, 포인터가 가리키는 값을 조작하여 임의의 파일 또는 코드에 접근
Stack Frame 레지스터
스택 오버플로우와 관련된 x86(32bit) 레지스터
- 범용 레지스터
- 스택 포인터 레지스터
- ESP: 스택의 Top을 가리킴
- EBP: 현재 스택 프레임의 베이스 주소를 가리킴
- 명령어 포인터 레지스터, 상태 레지스터, 세그먼트 레지스터
- EIP: 명령어 주소를 계산하는데 사용
- EFLAGS: x86 프로세서의 상태를 저장하기 위해 사용
- 세그먼트 레지스터: 각 세그먼트의 위치를 가리킴, 물리 주소 변환에 사용
- 코드 세그먼트 (CS), 스택 세그먼트 (SS)
- 데이터 세그먼트 (DS), bss 세그먼트
Stack Frame 명령어/세그먼트 레지스터
- 명령어 레지스터
- 유효주소를 계산하는데 필요한 주소 저장
- EIP (Extended Instruction Pointer) - PC (Program Counter)라고도 칭함
- 세그먼트 레지스터
- CS (코드 세그먼트): 실행 가능한 명령어 코드가 존재하는 세그먼트의 시작 주소
- SS (스택 세그먼트): 스택이 존재하는 세그먼트의 시작 주소
- DS (데이터 세그먼트): 사용되는 데이터가 존재하는 세그먼트의 시작 주소
- ES, FS, GS: 추가 세그먼트의 시작주소로, FS는 통상 스레드 관리용도로 사용
- EBP 레지스터
- 스택 세그먼트에서 현재 호출되어 사용되는 함수의 시작 주소 값 저장
- 함수로 전달되는 지역변수 등을 참조할 때 기준, ESP 레지스터와 함께 사용되어 스택 프레임(stack frame)을 형성
- 실제 메모리상의 주소를 참조할 때 SS(Stack Segment) 레지스터와 함께 사용
- ESP 레지스터
- 현재 스택 영역에서 가장 하위 주소를 저장
- EBP와 마찬가지로 실제 메모리상의 주소를 참조할 때 SS (Stack Segment) 레지스터와 함께 사용
I.Sly_bof 스택 프레임 구조와 주소 그려보기
I.Sly_bof.c 파일

pwntools 확인

pwntools 설치

cd Downloads
gdb I.Sly_bof 명령어 입력

disass main

(스택구조를 정확하게 파악하지 못해서 과제 해답이 올라오면 공부 후 수정해놓겠습니다)

I.Sly_bof flag
run 실행 후 숫자 입력
1111 , 222222222
-> 8자리가 안되거나 9번째 자리 숫자에 'I.Sly'가 아닌 다른 단어가 온 경우 flag값 출력 X
22222222I.Sly -> flag값 출력되는것을 확인 가능
Flag: Cutie Pretty Handsome Cool I.Sly()♥
