I.Sly() 기초 활동 과제 7주차

나영·2024년 5월 17일

I.Sly()

목록 보기
7/8

강의 내용 정리


Pwnable(시스템 해킹)

  • 권한을 자기 것으로 만든다는 의미
  • 원래 권한을 자기 것으로 만든다는 의미에서 ownable이 정식 명칙이지만, 대회 당시 오타로 pwnable이라고 입력했던 것에서 유래
  • 운영체제 또는 프로그램 취약점을 찾아 공격하고, 관리자의 권한 등을 얻어 시스템 을 장악하거나 의도치 않은 행동을 하게 하는 것
  • 컴퓨터 프로그램의 행위를 조작하여 공격자가 원하는 행동을 실행하도록 하는 공격

포너블을 통해서 궁극적으로 하는 일 → 관리자 권한 탈취

  • 과정
    1. 프로그램상의 취약점을 발견
    2. 취약점을 기반으로 공격 시나리오를 작성
    3. 공격 시나리오를 기반으로 하여 필요한 정보를 수집하고, 공격 (그 과정에서 메모리 구조 분석 등이 필수)
    4. 공격을 성공시키고, 권한 탈취 원하는 정보 알아내기

Pwntools

  • 리눅스 환경에서 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) 레지스터

  • 범용 레지스터
    • EAX, EBX, ECX, EDX
  • 스택 포인터 레지스터
    • 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()♥

0개의 댓글