gdb - 调试由 pwntools 打开的程序

标签 gdb stack-overflow pwntools

我正在尝试为大学类(class)做一个 stackoverflow。我要利用的二进制文件有一个金丝雀,但是,有一种方法可以将该金丝雀泄漏到标准输出。金丝雀当然由一些随机字节组成,所以我不能只从程序输出到标准输出的字符串中读取它们。

出于这个原因,我正在使用 python 和 pwntools,例如 p.recv(timeout = 0.01).encode("hex")(我使用 pwntools 只是因为我不知道另一种读取十六进制格式输出的方法,如果有更简单的方法我当然可以使用其他方法)

这或多或少按预期工作,我设法写入了金丝雀之后的内存区域。但是,我遇到了段错误,所以我显然对我造成的计算器溢出有一些问题。我需要一种对此进行调试的方法,例如在我提供导致 stackoverflow 的输入后查看堆栈。

现在不用多说了,真正的问题是:我可以在 GDB 或其他程序中调试我使用 pwntools(如 process("./myprog"))启动的进程吗可以显示堆栈的内容吗?

我已经尝试在 python 中获取 pid 并使用 gdb attach 附加到该 pid,但这没有用。

注意:我试图利用的二进制文件设置了 guid。不知道这是否重要。

最佳答案

您可以使用 pwnlib.gdb与gdb接口(interface)。

您可以使用 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')

或者你可以使用 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()

pwntools 模板包含让您开始使用 gdb 进行调试的代码。您可以通过运行 pwn template ./binary_name > template.py 创建 pwntools 模板。然后你必须在运行 template.py 时添加 GDB arg 进行调试:./template.py GDB.

如果您得到 [ERROR] Could not find a terminal binary to use.,您可能需要在使用 gdb 之前设置 context.terminal

如果您使用的是 tmux,下面的命令会在一个新的水平分割窗口中自动打开一个 gdb 调试 session :
context.terminal = ["tmux", "splitw", "-h"]

并使用新的 gdb session 窗口垂直分割屏幕:
context.terminal = ["tmux", "splitw", "-v"]

(注意:我从来没有让这部分工作,所以我知道它是否会工作。告诉我你是否让 gdb 工作了)。
(要使用 tmux,请在您的机器上安装 tmux,然后只需键入 tmux 即可启动它。然后键入 python template.py GDB

如果以上方法都不起作用,那么您始终可以启动脚本,使用 ps aux,找到 PID,然后使用 gdb -p PID 附加到正在运行的进程。

关于gdb - 调试由 pwntools 打开的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61427720/

相关文章:

c - (gdb)print 指针和 printf ("%p",指针) 给出不同的地址

linux - GNU 调试器 __text_start () 在错误的文件路径

java - 让java等待直到调用一个属性?

lisp - (cadr) 上的 Clisp "Program stack overflow. RESET"。如何?

python - 为什么在终端和运行终端的程序中内联打印转义的十六进制字符之间存在差异?

python - 获取终端输出的颜色/返回文本的颜色

objective-c - 快速找到 gdb 中断言的线程的方法?

c - 如何调试被覆盖的指针?

java - 如何从递归 getHeight 方法修复堆栈溢出

python - 使用其他版本的 libc 的 LD_preload 在 pwntools 中不起作用