Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何从只接受小数的字符串格式漏洞中获取地址?_String_Format_Buffer_Overflow_Memory Address - Fatal编程技术网

String 如何从只接受小数的字符串格式漏洞中获取地址?

String 如何从只接受小数的字符串格式漏洞中获取地址?,string,format,buffer,overflow,memory-address,String,Format,Buffer,Overflow,Memory Address,我试图利用字符串格式漏洞获取函数的地址。我有一个名为“exit”的函数指针,它指向一个函数a。我需要使“exit”指向另一个函数B,该函数B位于与a的某个地址偏移量处(在本例中,它距离a有32个十进制地址)。为此,我需要将“exit”地址的值设置为B的地址。我的问题是:我不知道“exit”的初始值(也是A的地址),因此我需要利用字符串格式来尝试查找A的地址 我从一个44字节长的无符号字符缓冲区开始。假设指针“exit”位于缓冲区[48](我只是简化问题)。我正在进行缓冲区溢出以达到P。在进行缓冲

我试图利用字符串格式漏洞获取函数的地址。我有一个名为“exit”的函数指针,它指向一个函数a。我需要使“exit”指向另一个函数B,该函数B位于与a的某个地址偏移量处(在本例中,它距离a有32个十进制地址)。为此,我需要将“exit”地址的值设置为B的地址。我的问题是:我不知道“exit”的初始值(也是A的地址),因此我需要利用字符串格式来尝试查找A的地址

我从一个44字节长的无符号字符缓冲区开始。假设指针“exit”位于缓冲区[48](我只是简化问题)。我正在进行缓冲区溢出以达到P。在进行缓冲区溢出攻击的过程中,我在遍历for循环时,基本上有48次随机数迭代

下面的scanf要求用户输入数字。当我输入“%x”或“%d”或任何其他类型的格式滥用时,我无法返回地址,程序终止。当输入只需要一个数字时,是否有可能利用字符串格式漏洞进行攻击

我不能修改代码,我只能通过输入来利用程序。根据下面的代码,我如何在任何时候找到A或B的地址

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

struct container {
    unsigned char buffer[44];
    void (*exit)();
};

void B() {
    puts("You've executed the correct function!");
}

void A() {
    puts("Wrong function");
}

int main() {
    struct container * my_container = malloc(sizeof(struct container));
    memset(my_container->buffer, 0, 44);
    my_container->exit = &A;

    for (int i = 0; i < 50; i++) {
        printf("What number goes into the buffer at index %d? ", i);
        unsigned int input_num;
        scanf("%d", &input_num);
        if (input_num == 0) {
            break;
        }
        my_container->buffer[i] = input_num & 0x000000ff;
    }

    my_container->exit();
    free(my_container);
}
#包括
#包括
#包括
结构容器{
无符号字符缓冲区[44];
无效(*退出)();
};
无效B(){
puts(“您执行了正确的函数!”);
}
作废{
puts(“错误函数”);
}
int main(){
结构容器*my_container=malloc(sizeof(结构容器));
memset(myu容器->缓冲区,0,44);
我的容器->退出=&A;
对于(int i=0;i<50;i++){
printf(“什么数字进入索引%d处的缓冲区?”,i);
无符号整数输入_num;
scanf(“%d”、&input_num);
如果(输入_num==0){
打破
}
my_container->buffer[i]=input_num&0x000000ff;
}
我的容器->退出();
免费(我的集装箱);
}

我希望“%x”的输出是堆栈指针当前位置的地址。相反,它会终止程序。

欢迎使用StackOverflow。你应该给我一个机会。您的代码在语法上无效,无法给出任何答案。感谢您将我链接到最小可复制示例。我已经更新了我的帖子,加入了我所面临问题的工作副本。