题目描述:
大致告诉我们研究的可能是Linux下的文件描述符。需要我们用ssh链接过去找到flag。于是我们就过去看看:
乍看情况有点像简单nc,我们尝试看看目录下都有什么:
看到flag,那么尝试输出呢?
Permission denied意味着权限被拒绝。我们没有权力访问这个文件。我们还看到有两个文件,一个fd,一个fd.c。我们需要把这个代码趴下来做一个小小的代码审计,这里运用到的命令有这些:
scp
(Secure Copy Protocol)是用于在本地系统和远程系统之间安全地传输文件的命令行工具。下面是一些常见的scp
命令用法:
-
从本地系统复制到远程系统:
bashCopy code
scp local_file username@remote_host:remote_path
示例:
bashCopy code
scp myfile.txt user@192.168.1.100:/home/user/documents/
-
从远程系统复制到本地系统:
bashCopy code
scp username@remote_host:remote_path local_file
示例:
bashCopy code
scp user@192.168.1.100:/home/user/documents/myfile.txt /local/path/
-
从远程系统复制到本地系统并保持文件名相同:
bashCopy code
scp username@remote_host:remote_file local_path
示例:
bashCopy code
scp user@192.168.1.100:/home/user/documents/myfile.txt .
-
从本地系统复制到远程系统并保持文件名相同:
bashCopy code
scp local_file username@remote_host:remote_path
示例:
bashCopy code
scp myfile.txt user@192.168.1.100:/home/user/documents/
这个scp用于远程传送文件,我们可以把远程服务器的文件复制一份传到本地:
那么在我本地的当前目录就会有这两个文件。我们查看下fd的源代码:
这个代码的大致流程如下:
- 接受命令行参数,期望有一个参数传递给程序。
- 将传递的参数通过
atoi
函数转换为整数,并减去0x1234
。 - 使用得到的整数作为文件描述符(File Descriptor),调用
read
函数从文件中读取数据到缓冲区buf
。 - 将读取到的内容与字符串 "LETMEWIN\n" 进行比较,如果相同则执行一些操作。
- 如果比较结果为真,则输出 "good job :)",执行
system("/bin/cat flag");
命令来显示 flag 文件的内容,并退出程序。因此我们需要在执行的时候传入一个参数,使得它能触发system函数。这里蕴含了一个小小的知识点。就是在read这个函数的第一个参数,如果这个文件描述符为0则为标准输入输出,也就是从用户终端读取数据放入buf中。因此我们需要使fd为0。才能触发后续流程。atoi这个函数会把我们传入的数据变成整数,因此我们输入的时候不能传入0x1234。
我们需要传入4660,试验一下:
成功走到else语句。再通过strcmp判断即可,意味着如果我们输入LETMEWIN,程序讲进入if语句。(因为判断成功后strcmp返回的是0,再取反为真)我们尝试一下:
本地成功,再去远程服务器执行下,得到flag:
通过这题我们能学到ssh远程链接的一些操作以及scp从远程服务器复制文件的操作。并且参杂了一些代码审计的思想。并找到漏洞成功执行。