kri*_*ise 4 stack-overflow gdb pwntools
我正在尝试为大学的一门课程做一个 stackoverflow。我要利用的二进制文件有一个金丝雀,但是,有一种方法可以将该金丝雀泄漏到标准输出。当然,金丝雀由一些随机字节组成,因此我不能只从程序输出到标准输出的字符串中读取它们。
因此,我使用 python 和 pwntools,例如p.recv(timeout = 0.01).encode("hex").
(我使用 pwntools 只是因为我不知道以十六进制格式读取输出的另一种方法,如果有更简单的方法我当然可以使用其他方法)
这或多或少可以按预期工作,我设法写入了金丝雀之后的内存区域。但是,我遇到了段错误,所以我显然对我造成的 stackoverflow 有一些问题。我需要一种调试方法,比如在提供导致堆栈溢出的输入后查看堆栈。
现在,不用多说,实际的问题是:我可以调试在 GDB 中使用 pwntools (如 )启动的进程process("./myprog")或可以向我显示堆栈内容的其他程序吗?
我已经尝试在 python 中获取 pid 并使用 gdb Attach 附加到该 pid,但这不起作用。
注意:我尝试利用的二进制文件具有 guid 集。不知道这是否重要。
deu*_*ide 13
您可以使用pwnlib.gdb与 gdb 进行交互。
您可以使用 gdb.attach() 函数:来自文档:
bash = process('bash')
# Attach the debugger
gdb.attach(bash, '''
set follow-fork-mode child
break execve
continue
''')
# Interact with the process
bash.sendline('whoami')
Run Code Online (Sandbox Code Playgroud)
或者您可以使用 gdb.debug():
# Create a new process, and stop it at 'main'
io = gdb.debug('bash', '''
# Wait until we hit the main executable's entry point
break _start
continue
# Now set breakpoint on shared library routines
break malloc
break free
continue
''')
# Send a command to Bash
io.sendline("echo hello")
# Interact with the process
io.interactive()
Run Code Online (Sandbox Code Playgroud)
pwntools 模板包含帮助您开始使用 gdb 进行调试的代码。您可以通过运行来创建 pwntools 模板pwn template ./binary_name > template.py。然后你必须在运行 template.py 进行调试时添加 GDB arg: ./template.py GDB。
如果出现[ERROR] Could not find a terminal binary to use.,则可能需要context.terminal在使用 gdb 之前进行设置。
如果您使用 tmux,以下命令将在新的水平分割窗口中自动打开 gdb 调试会话:
context.terminal = ["tmux", "splitw", "-h"]
并使用新的 gdb 会话窗口垂直分割屏幕:
context.terminal = ["tmux", "splitw", "-v"]
(注:我从来没有让这部分工作过,所以我不知道它是否能工作。告诉我你是否能让 gdb 工作工作)。
(要使用 tmux,请在您的计算机上安装 tmux,然后只需键入tmux即可启动它。然后键入python template.py GDB.
如果以上方法都不起作用,那么您始终可以启动脚本,使用ps aux,找到 PID,然后使用gdb -p PID附加到正在运行的进程。