我正在尝试找出此缓冲区溢出漏洞。任何指针都会有所帮助。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct node_t {
int x;
char y;
float z;
} node_p;
void unsafe() {
int read_char;
int other_value = 0xFFFF;
int* protector = (int *)malloc(sizeof(node_p)*33);
char buffer[24];
printf("Input string):n");
read(0, buffer, 1000);
read_char = strlen(buffer);
if (*(&protector + other_value) == 0xbadf00d) {
if (read_char > 24) {
printf("ntoo many char!n");
exit(-1);
} else {
printf("exploit accessed");
}
}
}
int main(int argc, char* argv[]){
unsafe();
return 0;
}
在向保护器添加其他值后,我想我得到了保护器的地址溢出0xBA5F015 如何处理这个问题
检查下面的代码,看看它是否有帮助。重点是badf00d
是现有代码(漏洞利用)中的触发器,恶意程序是通过read
调用加载的。
通常,目标是发现other_value
的正确值,并对输入进行模糊处理以发现read
中的漏洞。
读取输入是漏洞利用插入恶意代码的地方。 1000 字节对于只有 24 个字节的buffer
分配的本地堆来说太多了。
请注意,将0xffff
添加到protector
会使地址远离漏洞利用触发器存在且漏洞利用想要执行的after_buffer
。该漏洞希望在触发地址有一些特定的值badf00d
。
从这里开始的几个可能的结果: 知道值存在可以确认,当函数返回时,恶意代码将控制程序计数器。
知道值存在可以确认可以调用某些触发器来加载恶意代码。
一旦执行被badf00d
重定向,堆栈上的任何代码都可以执行。
read_char=0x0c999c
other_value=0x0c9998
protector=0x0c9990
buffer=0x0c99a0
after_buffer=0x0c998f
protector+offset=0x149988
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct node_t {
int x;
char y;
float z;
} node_p;
void unsafe() {
int read_char;
int other_value = 0xFFFF;
int* protector = (int *)malloc(sizeof(node_p)*33);
char buffer[24];
char after_buffer;
printf(" read_char=%pn", &read_char);
printf(" other_value=%pn", &other_value);
printf(" protector=%pn", &protector);
printf(" buffer=%pn", &buffer);
printf("after_buffer=%pn", &after_buffer);
printf("n");
printf("protector+offset=%pn", (&protector + other_value) );
return;
}
int main(int argc, char* argv[]){
unsafe();
return 0;
}