事前准备
![](https://i-blog.csdnimg.cn/blog_migrate/a77d3963aa4e8e9f0f1d94cffbb036b2.png)
32小端,部分延迟绑定,不可执行
看看ida
![](https://i-blog.csdnimg.cn/blog_migrate/a6412a671ed652b8b8223cbe6664f015.png)
有system字符串,说明有其对应函数
(此题文件分析部分较长就另起一个标题)
ida函数分析
![](https://i-blog.csdnimg.cn/blog_migrate/38bc9ddbfd5999a74a6264ae3510208e.png)
前面是各种缓冲区重置后面就像put()里面说的,每个函数对应的功能就是这样,通过switch进函数
![](https://i-blog.csdnimg.cn/blog_migrate/ebb771c22f319744767952b21b7a0797.png)
每个函数跟进看一下:
第一个case0直接正常退出就不说了
![](https://i-blog.csdnimg.cn/blog_migrate/5636b8a963b0e16a8b2cfe26ba5cbb4a.png)
这个case1可以挺有说法的,这里的a1接收的是主函数中src字符串数组的首地址
scanf函数
注意scanf函数的写法,a1没有&,字符串的写入就是不用&的,%s寻找的是后面参数中的地址,所以当不用取址符时,就会把a1中存储的当做地址进行写入。这里的存储地址,也就是指向src,所以这个函数实现了,对src这个变量的写入。
可以看到每个case后面基本上都还有同一个函数,跟进去看看:
![](https://i-blog.csdnimg.cn/blog_migrate/41047454de483417d33c0f2b41a6d426.png)
jmp一个地址: 也就是将程序执行流跳转到这个地址去,ctrl+s查看文件段,发现大致在text段。
在ida总汇编界面找找具体指向哪里
![](https://i-blog.csdnimg.cn/blog_migrate/cc4b663a24e00d5700e3e4867124bc04.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9fa291f3137df90b1d98cfa9fcf0ea0a.png)
直接指向的句子是函数调用准备的第一句。不难发现,他又跳回了switch那的功能选择界面,应该是程序功能所致
再来看看其他函数
![](https://i-blog.csdnimg.cn/blog_migrate/890425364b16ee50b32ba0517ebab032.png)
打印src,没啥用
![](https://i-blog.csdnimg.cn/blog_migrate/a3954ff23fc4a71b2ddd2421ac9f14ae.png)
这个函数更没啥用,应该就没写完,就一个echo printing
![](https://i-blog.csdnimg.cn/blog_migrate/7ef9f0227c8c4302b57a827752b7d86a.png)
这个函数,就是我们要找的东西了
漏洞及其利用思路
可以发现,getflag函数中出现了strcpy,而dest+v3总共只有64k,能够溢出(我们的src可以写128),程序中存在system函数,32位sh直接入栈调用就行,所以我们现在还缺一个sh
你可能会疑惑,不应该是‘‘/bin/sh’’吗,为啥是‘sh’
system函数实际上执行的是linux系统中的命令,/bin/sh命令和sh命令都可以呼出shell
(这题的主要原因还是没找到/bin/sh字符,其他甚至有题目是直接 cat flag,本着有什么用什么的原则)
ropgadget找找
![](https://i-blog.csdnimg.cn/blog_migrate/50022c2765b757ab7b29f15a2b5e849f.png)
到这里,就可以编写exp了
exp:
![](https://i-blog.csdnimg.cn/blog_migrate/bf8d5104a989fcf00d080e2fb699fd8f.png)
getshell:
![](https://i-blog.csdnimg.cn/blog_migrate/d83e3fe3677e3aff02cd15e33e46856d.png)