소학회/인프런_강의정리

[해킹대회(CTF)출전을 위한 시스템해킹(Pwnable)입문]_0926

도아돵 2023. 9. 26. 03:01

[시스템 해킹]_입문편


섹션 0. 시스템 해킹 이해하기

 

해킹목표: 하면 안되는 것 하기

해킹: 권한이 없는 행위 하기

 

시스템 장악(Shell 실행) == 실행하고 싶은 코드를 실행할 수 있음

실행하고 싶은 프로그램(코드)를 실행시켜주는 프로그램: 쉘(Shell)

나의 통제 하에 있는 행위: 해킹 X,내가 시스템을 장악한 상태 

남의 컴퓨터로 넘어가서 계산기를 연다면 ?-> 명백한 해킹

시스템: PC 그 자체


 

섹션 1. 패킹대회(Pwnable)의 문제상황 이해하기

도메인 이름:인터넷에 연결된 컴퓨터의 이름

포트:네트워크에 연결된 컴퓨터에서 돌아가고있는 프로그램의 번

+시스템해킹문제를 푸는건데 왜 nc(원격접속)이 필요한가 ?


ctf pwnable에서 출제되는 문제상황 : 인터넷 어딘가에 위치한 외부  remote환경에서 내부 환경으로 침투하여 들어가는 것 
따라서 인터넷 어딘가에 있는 프로그램에 접속하는 이 nc 그리고 접속정보가 필요함 

즉  pwnable의 문제상황 // 외부에 노출되어있는 포트로 접속가능한 프로그램에 접속하여, 악의적인 실행흐름을 통해 시스템을 장악하는 것

 

 

 


섹션2. 악의적인 실행으름 만드는법

  • 컴퓨터 구조 이해하기

 

 

  • 프로그램 실행과정

->컴퓨터역할은 코드에 적힌대로 실행을 해주는것 // 이것이 컴퓨터 구조의 취약점 (왜냐? 이 pc에 있는 값이 잘못된 값인지 실행해도 되는 값인지 전혀 검사하지 않기 때문)

 

  • 악의적인 실행흐름 만들기

컴퓨터는 주소 값들을 검증하지 않고 실행하기 떄문에 이를 이용해 악의적인 실행흐름 만듦

메모리 영역 어딘가에 실행하고 싶은 코드를 입력하고. PC 값을 그 코드가 잇는 주소로 바꿔줌

  • ex) 0xFFFFF라는 임의의 주소에 'password 가 뭔지 알려줘' 라는 악의적인 코드를 삽입->다음번에 CPU가 해야할 일의 주소를 가리키고 있는 레지스터의 값을 0xFFFFF로 변경할 시,  CPU는 이 주소에 가서 코드를 읽고 실행->해킹

섹션3. Pwnable 학습을 위한 실습환경설정(Configuration)

Window에서 Ubuntu OS 설치하기 (VM이용) : 포스타입 포스트 (postype.com)

링크//  윈도우에 Ubuntu OS를 설치하는 방법

https://juntheworld.postype.com/post/13437080

링크// 포너블 문제풀이를 위한 도구들을 설치(프로그램 분석도구인 gdb와 pwntools를 설치)

+  pwndbg : 시각적으로 예쁠 뿐아니라 다양한 정보들을 잘 정리해서 보여줌


섹션4. 취약점 이론과 공격기법 실습-HelloFlag

  • CTF Pwnable 문제에서 주어지는 파일 확인

플래그 파일

-플래그:우리가 목표로 하고있는 값

- 쉘프로그램을 열고 쉘에서 내 명령어가 잘 작동하는 것을 증명하면 됨

      ->  cat flag라는 명령어를 통해 서버에 존재하는, 정상적인 루트로는 확인할 수 없고 해킹을 통해서만 확인할 수 있는               플래그 파일을 읽었음을 보이는 것

             * cat flag: 파일의 값을 읽는 명령어

 

타겟 바이너리

-  C언어, C++, python등으로 만들어진 실행가능한 프로그램

-  ELF 파일(리눅스),  exe 파일(윈도우)

 

소스코드

-getflag함수: execve라는 함수에서 /bin/sh을 실행 // 시스템에 원하는 명령어를 자유롭게 사용

 

  • Pwnable 문제풀이 과정

 pwnable 문제풀이 : 취약점 분석 → 공격 시나리오 수립 → 익스플로잇 코드 작성


섹션5. 취약점이론과 공격기법 실습 - BasicBOF

지역변수: 스택메모리 내 들어있는 값들

Return 주소:(프로그램 동작은 무조건 함수로 이뤄짐)caller로 돌아감

EBP: 전 스택 프레임의 시작 주소

스택 프레임: 특정한 함수의 실행정보들을 묶음

+ 이전 스택 프레임의 시작주소를 가지고 있으면 손쉽게 스택프레임을 나눌 수 있음!!!

 

- EIP와 EBP는 모두 레지스터

- EIP 레지스터의 역할: CPU가 지금 실행중인 코드의 위치를 담고있기 //  CODE 영역 어딘가에 있는 ‘주소’// Program Counter에 해당하는 레지스터

- EBP 레지스터의 역할: 지금 실행중인 함수의 스택프레임 시작위치를 담고있기 //  STACK 영역 어딘가에 있는 ‘주소’

// STACK에 저장하는 것은 이 레지스터 안에 담겨 있는 ‘값’ 

 

스택을 공부하는이유-> 입력길이를 검증하지않는 입력함수에 의해서 Stack Buffer Overflow가 일어날 수 있다는 것을 이해하기 위해서!!

 

;

보통 이런식으로 표현 ㅎ

;

 

'Stack Buffer Overflow 라는 취약점을 이용한 Return Address Overwrite 공격기법 실습'


*인프런 강의를 수강한 후 정리한 글입니다.*

[무료] 해킹대회(CTF) 출전을 위한 시스템해킹(Pwnable) 입문 - 인프런 | 강의 (inflearn.com)