已关闭此问题为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。
1条答案
按热度按时间zzoitvuj1#
你做到了。
system
命令在内部作为/bin/sh -c id
执行,bash >= 2的版本在启动时会故意丢弃setuid特权。我猜那密码是很久以前的了他们可以通过使用
execve
系统调用而不是system
库例程来解决这个问题,甚至可以使用read
和write
来复制文件。