4주차 포너블

민채은·2025년 4월 13일

ECOPS 16th

목록 보기
4/5

이론

포너블

  • 시스템 해킹 : 운영체제나 소프트ㅜ에어, 하드웨어에 내재된 보안 취약점을 해킹하는 것

  • 포너블 : 공격으로 관리자 권한을 탈취해 쉘을 따내는 것

  • 쉘 코드 : 작은 크기의 코드로 소프트웨어 취약점 이용을 위한 내용부에 사용됨

  • 공격 과정

  1. 프로그램 취약점 발견
  2. 취약점 기반 공격 시나리오 작성
  3. 공격 시나리오를 기반으로 하여 필요한 정보 수집 및 공격
  4. 공격 성공 후 권한을 탈취하거나 원하는 정보 GET

어셈블리어

  • 어셈블리어 = 기계어를 사람이 읽을 수 있는 형태로 바꿔주는 역할

  • 취약점이 있는 공격 대상 파일을 리버싱을 통해 분석해 Machine Code를 의사코드 형태로 복원하고 메모리 레벨에서 이해시 필요

  • Buffer over flow에서 적절한 padding 사용과 return address의 정확한 위치를 찾기 위해 gdb 사용시 필요

  • 스택

    • LIFO (Last In First Out) -> 나중에 들어온 것이 먼저 나감
    • 데이터를 넣는 것 = push, 값을 추출하는 것 = pop, 현재 스택 포인터 = top
    • push하면 스택 포인터가 하나씩 감소하고, pop할 때마다 스택 포인터가 하나씩 증가됨
  • 시스템 콜 : 유저 모드에서 커널 모드의 시스템 소프트웨어에게 동작 요청을 하기 위해 사용함

    • 요청 : rax
    • 인자 순서 : rdi → rsi → rdx → rcs → r8 → r9 → stack

  • 운영체제 : 컴퓨터 시스템에서 하드웨어와 응용 프로그램 사이의 인터페이스 역할을 하며, 컴퓨터 자원을 효율적으로 관리하는 시스템 소프트웨어

    • 기능
    1. 프로세스 관리
    2. 메모리 관리
    3. 파일 시스템 관리
    4. 입출력 장치 관리
    5. 보안
    6. 네트워킹
  • 쉘 : 운영체제에서 사용자와 컴퓨터 하드웨어 사이를 중계해주는 인터페이스
    → 사용자가 입력한 명령어를 운영체제에서 이해할 수 있는 형식으로 변환하고, 컴퓨터 하드웨어를 이용해 명령을 실행시켜주는 역할
    사용자와 운영체제 간 대화를 가능하게 함
    터미널 창에서 실행, 사용자가 입력한 명령을 해석하고 결과를 출력 → 일반적으로 명령어 해석기와 함께 제공됨

  • 커널 : 운영체제의 핵심 부분으로, 하드웨어와 소프트웨어 간의 인터페이스 역할을 수행
    운영체제의 가장 중요한 부분, 다른 모든 시스템 소프트웨어는 커널과 상호작용해 동작
    운영체제에 따라 필요한 기능과 특성을 반영해 다른 디자인과 구현을 갖는다.

  • 쉘 코드 : 관리자 권한을 얻기 위해 필요한 함수들을 byte 코드로 옮긴 것
    일반적으로 어셈블리어로 작성된 후 기계어로 변경됨

    • orw 쉘코드 : Open Read Write → 특정 파일을 열고, 읽고, 출력하는 코드
    • execve 쉘코드 : 임의의 프로그램을 실행하는 일반적 쉘코드
      → 최신 리눅스는 대부분 sh, bash 등 기본 셸 프로그램 가짐

과제

basic_exploitation_000


basic_exploitation_000.c 파일
main 함수를 보면 buf의 헥사값이 0x80이므로 buf의 크기는 128byte임
scanf 함수는 141 byte의 문자열을 받음
=> 버퍼 오버플로우가 발생함

objdump -d basic_exploitation_000으로 디어셈블을 함

printf로 출력되고, scanf로 입력받음을 알 수 있고, __x86.get_pc_thunk.bx라는 함수를 확인할 수 있음


__x86.get_pc_thunk.bx 함수의 내용임

basic_exploitation_000을 실행해봄

실행할 때마다 buf의 헥사 값이 바뀌는 것을 볼 수 있음

python으로 쉘코드를 작성함(블로그 참고)

실행해보니 pwn이 없다고 해서 pwntools를 설치함


터미널에서 python 코드를 실행해서 DH를 찾음

basic_exploitation_001


basic_exploitation_001.c 파일
read_flag() 함수를 실행하면 cat flag를 진행함
-> 버퍼 오버플로우로 read_flag() 함수를 실행시켜 flag를 얻어내야 함

gdb basic_exploitation_001을 실행함

info functions를 실행함

-> read_flag() 함수의 주소를 찾을 수 있음 (0x080485b9)

쉘코드를 작성함(블로그 참고)

터미널에서 python exploit.py를 실행하고 ls를 입력하면 flag를 얻을 수 있음

0개의 댓글