我试图通过 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 循环作为模式创建的代理(希望看到哪个整数导致崩溃)。
任何见解将不胜感激!
您可以使用pwntools自带的循环模式。只需输入
cyclic n
其中
n
是要生成的循环模式的字节数。
在 gdb 中运行程序并提供循环模式作为输入,当程序崩溃时检查
eip
rsp
中的前4个字节
这将是我们的偏移量
现在运行cyclic -l offset_found
这告诉我们到达指令指针寄存器的偏移量,假设命令的输出是104,这意味着接下来的4个字节(在32位二进制中)或接下来的8个字节(在64位二进制中)将覆盖指令指针。