老司机说的p站是什么?萌新带你开车上p站

0x01前言:
这一系列文章为.’s 的全部题解 , 其中有三道题目相对而言稍难或者说比较经典 , 单独成篇 , 其他题目的题解放在一起发出来 。
Ssh连接

老司机说的p站是什么?萌新带你开车上p站

文章插图
看一下目录
我们需要执行flag , 或者查看flag的内容
看题目的提示就知道这题和文件描述符有关
老司机说的p站是什么?萌新带你开车上p站

文章插图
看看源码
老司机说的p站是什么?萌新带你开车上p站

文章插图
在代码中我们可以看到要通过()比较后会输出
查看的用法
老司机说的p站是什么?萌新带你开车上p站

文章插图
可知 , ()中 , 若参数s1和s2字符串相同则返回0 , s1大于s2则返回大于0的值 , s1小于s2则返回小于0的值 。
代码中要cat flag执行的话if语句应满足返回0 , 即buf的内容应为
那么buf的值哪来的呢
man read可知
老司机说的p站是什么?萌新带你开车上p站

文章插图
的值由read控制 , 从fd读入count个字节内容
fd在代码中的值为atoi(argv[1])-
atoi()用于把字符串转换为整数
由linux下文件描述符可知(源码在/usr//.h)
老司机说的p站是什么?萌新带你开车上p站

文章插图
即文件描述符0表示标准输入 , 也就是我们可以从命令行中控制的 。
Atoi接收的参数我们可以控制 , 只要令argv[1]为(argv[0]为程序名称 , argv[1]为输入参数) , 十进制为4660 , 经过运算最后赋值给fd的就是0 , 然后再传入read() , 由于fd为0 , 所以我们在命令行中输入什么 , 则在中写入的就是什么 , 只要输入就可以了
分析完毕 , 接下来测试一下
通过,关闭ssh连接
老司机说的p站是什么?萌新带你开车上p站

文章插图
看题目描述应和哈希碰撞相关
老司机说的p站是什么?萌新带你开车上p站

文章插图
看看源代码
老司机说的p站是什么?萌新带你开车上p站

文章插图
在main()中看到传入的argv[1]需要满足条件:
长度为20字节 , 传给后的返回值为硬编码的
那么我们需要来看一下的逻辑
可以看到传参为char型指针 , 在逻辑中被强制类型转换为int型指针
从大小的角度来看即1字节转换为4字节 , 一共20字节 , 20/4=5 , 刚好对应for循环里的5次 , for循环是做了个累加的操作 , 即累加和等于即可
emmm简单理解 , 就是说输入20字节 , 每4字节一组 , 共5组 , 5组相加后等于即可 。
这就很简单了
我设16个字节为0x1 , 那么另外的4字节应为差值 , 又因为小端序 , 所以写的时候倒过来写即可 , 如下所示
根据题目描述这是一道缓冲区溢出的题目
老司机说的p站是什么?萌新带你开车上p站

文章插图
下载bof及其代码
老司机说的p站是什么?萌新带你开车上p站

文章插图
看看源码
老司机说的p站是什么?萌新带你开车上p站

文章插图
看到main中调用了func , 传参为
而func()中可以看到需要传参为才可以
老司机说的p站是什么?萌新带你开车上p站