-
-
[原创]pwnable.kr input 分析
-
发表于:
2020-6-20 20:17
19414
-
最近做htb的时候遇到了一个bof的题,但是由于很久之前学过的东西有点想不起,所以就找到了一个pwn的平台的练习。做了几个发现实际难度并不是很大,直到做到这个input的时候,感觉难度一下子就上来了(可能是对于linux理解太菜了,昨天看了一天),所以想进行一下详细的分析,希望可以把这道题所有的知识点都吃透。
本篇文章想从目标c语言开始分析,分析对应的汇编,以及到python和c两种语言的poc编写。
发现c中需要满足5个要求,方能得到flag,所以我们也分成5个部分进行分析
这里c语言描述的是需要至少100个参数,并且argv['A']得是\x00
也就是终止符,argv['B']为\x20\x0a\x0d.
由于直接写在ida中比较方便也比较清楚,所以就直接标注在ida里了。
效果如下:
效果如下:
这里作为c语言来说理解还是比较简单的,第一个read,读取标准输入,就是从键盘上获取一个标准输入,第二个read,获取标准错误输出,然后进行对比。真正的难点就是去如何构造这个标准错误输出了,输入还是比较好构造的。
感觉看了源码之后发现ida看起来也很清楚了
相对于c来说,还是觉的解决问题,python更快一点。
效果:
效果如下:
这里还是要说一下的,不然的话就没什么意义了。
涉及到知识点:
pipe,linux下的管道问题,这个管道有俩,一个是输入,一个是输出,我们需要做的就是控制这个输出的内容。
根据查到的资料,可以利用先fock一个子进程,在子进程进行输入,然后主进程复制文件流,拿到输出。此时就满足了题目的要求。但是之后发现不需要fock子进程,直接写也是可以的,没什么问题。
最终的实质就是利用pipe构造了标准错误输出。
这里的重点就是getenv,查了一下详细的说明如下。
该函数返回一个以 null 结尾的字符串,该字符串为被请求环境变量的值。如果该环境变量不存在,则返回 NULL。
我们的目标就是要构造一个环境变量
c语言也是直接设置就可以。
这里就是读取一个文件,然后读取的内容为\x00\x00\x00\x00即可。
这里的socket就是开了一个argv['C']的端口的socket,只要传进去一个 \xde\xad\xbe\xef就可以了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-6-21 21:14
被王嘟嘟编辑
,原因: