Skip to content

Commit

Permalink
stdout duplication support for inside and outside of docker
Browse files Browse the repository at this point in the history
  • Loading branch information
zardus committed Nov 14, 2024
1 parent ab61a0f commit 251ee32
Showing 1 changed file with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions pwnshop/challenge.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,15 +282,26 @@ def run_challenge(
self.build()

if not self._verify_container:
process = pwnlib.tubes.process.process(argv, **kwargs)
stdout_fds = kwargs.pop("stdout_fds", ())
def preexec_fn():
for i in stdout_fds:
os.dup2(1, i)

process = pwnlib.tubes.process.process(argv, preexec_fn=kwargs.pop("preexec_fn", preexec_fn), **kwargs)
else:
env = kwargs.pop("env", {})
alarm = kwargs.pop("alarm", None)
stdout_fds = kwargs.pop("stdout_fds", ())

process = pwnlib.tubes.process.process([
"docker", "exec", "-u", "root", "-i", "-w", self.work_dir,
self._verify_container.name, "/bin/sh"
self._verify_container.name, "/bin/bash"
], **kwargs)

redirects = ""
for fd in stdout_fds:
redirects += f" {fd}>&1"

for k,v in env.items():
kstr = k.decode('latin1') if type(k) is bytes else k
with open(f"{self.work_dir}/.pwnshop-env-var", "wb") as o:
Expand All @@ -300,10 +311,10 @@ def run_challenge(
os.unlink(f"{self.work_dir}/.pwnshop-env-var")

if alarm:
argv = [ "/bin/timeout", "-sALRM", str(alarm) ] + argv
argv = [ "/bin/timeout", "--preserve-status", "-sALRM", str(alarm) ] + argv

process.sendline("echo PWNSHOP-READY")
process.sendline(shlex.join(["exec"]+argv))
process.sendline(shlex.join(["exec"]+argv) + redirects)
process.readuntil("PWNSHOP-READY\n")

if close_stdin:
Expand Down

0 comments on commit 251ee32

Please sign in to comment.