利用 linux、scanf 和读取权限

问题描述

您可能会意识到这看起来像是一项作业,因此,我只是在寻找线索,不一定是完整的解决方案。

TLDR:有没有办法在 C 中使用 scanf 进行命令注入?以及如何读取我们没有权限读取的文件

目标是打开并读取两个文件,以便访问第三个文件file1file2file3文件权限如下:

-rw-r--r-- 1 root source 40 1 Jan. 00:00 folder/file1
-rw-r----- 1 root source 40 1 Jan. 00:00 folder/file2
-rw-r----- 1 root source 40 1 Jan. 00:00 file3
drwxr-x--x 2 root source 4096 1 Jan. 00:00 folder
-rwxr-sr-x 1 root source 14376 1 Jan. 00:00 exe

我们位于一个文件source 中,其中包含 file3一个可执行文件 exe 和另一个包含两个文件文件夹。如果我们可以访问 exefile3file 1 程序会显示 file 2内容file1 内容是可读的,因此我们知道它的内容是 pass1。

因此,当我们执行 exe 时,我们会看到一个提示(这是一个 scanf,程序是用 C 编写的)。

使用 strace ,这是我们得到的:

read(0,pass1
"pass1\n",1024)               = 7
openat(AT_FDCWD,"/source1/folder/file1",O_RDONLY) = 3
read(3,"pass1",6)                    = 6
fstat(1,{st_mode=S_IFCHR|0620,st_rdev=makedev(136,0),...}) = 0
// The next part only appear when we enter pass1 at the prompt
openat(AT_FDCWD,"/source1/folder/file2",O_RDONLY) = -1 EACCES (Permission denied)
read(4,0x5636137c16c0,16)             = -1 EBADF (Bad file descriptor)

这里我们看到了我认为的一种字符串比较,当我们在提示处正确获取 pass1 时,exe 尝试打开第二个文件,但无权这样做。在尝试打开 file2 之前没有第二个提示,因此没有机会输入第二个通道来尝试打开 file2,无论如何我们都没有权限.

我的问题是,有没有办法通过提示 scanf 进行命令注入?以及如何解决我们无权阅读 file2 的事实?还有一种方法可以使我们在第二次阅读时在提示下输入的内容不同(例如:第一次阅读时为 pass1,第二次阅读时为 pass2,因为我们在提示时输入了 pass1 和 pass2?)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)