linux 如何设置CTF游戏的可执行文件和标志文件权限[已关闭]

0yg35tkg  于 2023-10-16  发布在  Linux
关注(0)|答案(1)|浏览(95)

已关闭此问题为not about programming or software development。它目前不接受回答。

这个问题似乎不是关于a specific programming problem, a software algorithm, or software tools primarily used by programmers的。如果你认为这个问题与another Stack Exchange site的主题有关,你可以留下评论,解释在哪里可以回答这个问题。
5天前关闭。
Improve this question
我在准备一个CTF式的任务我将可执行文件ret2win设置为SetUID程序,并使用相同的用户ID和组ID更改了flag.txt和易受攻击的程序ret2win

$ ls -lth ret2win flag.txt
-rw------- 1 level1 PG0   33 Sep 16 15:11 flag.txt
-rwsr-sr-x 1 level1 PG0 7.3K Sep 16 15:11 ret2win

然而,即使我成功地劫持了控制流来执行执行system("/bin/cat flag.txt")的代码,我仍然得到了一个权限拒绝错误。如何成功设置此分配的权限?

$ ./ret2win < payload
ret2win by ROP Emporium
...
Well done! Here's your flag:
/bin/cat: flag.txt: Permission denied

更新(10/10/2023):
附加strace跟踪日志:

write(1, "Well done! Here's your flag:", 28Well done! Here's your flag:) = 28
write(1, "\n", 1
)                       = 1
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=0}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=0}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
mmap2(NULL, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xf7d78000
rt_sigprocmask(SIG_BLOCK, ~[], [CHLD], 8) = 0
clone3({flags=CLONE_VM|CLONE_VFORK, exit_signal=SIGCHLD, stack=0xf7d78000, stack_size=0x9000}, 88) = 10445
munmap(0xf7d78000, 36864)               = 0
rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
wait4(10445, /bin/cat: flag.txt: Permission denied
[{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 10445

此挑战需要重定向控制流以执行此ret2win函数,该函数似乎执行system("/bin/cat flag.txt")

0804862c <ret2win>:
 804862c:       55                      push   %ebp
 804862d:       89 e5                   mov    %esp,%ebp
 804862f:       83 ec 08                sub    $0x8,%esp
 8048632:       83 ec 0c                sub    $0xc,%esp
 8048635:       68 f6 87 04 08          push   $0x80487f6
 804863a:       e8 91 fd ff ff          call   80483d0 <puts@plt>
 804863f:       83 c4 10                add    $0x10,%esp
 8048642:       83 ec 0c                sub    $0xc,%esp
 8048645:       68 13 88 04 08          push   $0x8048813
 804864a:       e8 91 fd ff ff          call   80483e0 <system@plt>

我想知道system()函数是否以某种方式禁用了setuid。

zzoitvuj

zzoitvuj1#

你做到了。system命令在内部作为/bin/sh -c id执行,bash >= 2的版本在启动时会故意丢弃setuid特权。
我猜那密码是很久以前的了他们可以通过使用execve系统调用而不是system库例程来解决这个问题,甚至可以使用readwrite来复制文件。

相关问题