如何启用 GDB/GEF 以允许我在插入离散输入时查看堆栈如何变化?

问题描述 投票:0回答:1

我试图通过 pwntools 和 gdb 识别发生缓冲区溢出的偏移量。 这是 C 代码 (x64):

int input[8];
int count, num;
count = 0;
while(1)
{
        printf("Enter:\n");
        scanf("%d", &num);

        if (num == -1){
                break;
        } else {
                input[count++] = num;
        }

}

了解整数的大小为 4 个字节,我尝试通过 pwntools 向程序提供一串整数(代码如下):

from pwn import *

context.log_level = "debug"

io = gdb.debug('_file_')


for i in range(0,10,1):
        io.clean()
        io.sendline("{:d}".format(i))


io.interactive()

但是,我无法找到偏移量并尝试通过 gdb 调试程序。 我希望能够在输入每个整数时看到堆栈的变化(通过 ni 或 si)。 有没有更好的方法来确定程序崩溃的位置?

我使用 for 循环作为模式创建的代理(希望看到哪个整数导致崩溃)。

任何见解将不胜感激!

debugging assembly gdb buffer-overflow pwntools
1个回答
0
投票

您可以使用pwntools自带的循环模式。只需输入

cyclic n 

其中

n
是要生成的循环模式的字节数。 在 gdb 中运行程序并提供循环模式作为输入,当程序崩溃时检查

  • 如果是32位二进制,检查
    eip
  • 中的前4个字节
  • 如果是64位二进制,检查
    rsp
    中的前4个字节 这将是我们的偏移量 现在运行
cyclic -l offset_found

这告诉我们到达指令指针寄存器的偏移量,假设命令的输出是104,这意味着接下来的4个字节(在32位二进制中)或接下来的8个字节(在64位二进制中)将覆盖指令指针。

© www.soinside.com 2019 - 2024. All rights reserved.