运行的shellcode
问题描述:
我有以下至极运行工作正常一个的shellcode:运行的shellcode
unsigned char original[] =
"\xd9\xee\xd9\x74\x24\xf4\x58\xbb\xa6\xfb\x51\x8f\x33\xc9\xb1"
"\x62\x83\xe8\xfc\x31\x58\x16\x03\x58\x16\xe2\x53\x07\xb9\x0d"
"\x9b\xf8\x3a\x72\x12\x1d\x0b\xb2\x40\x55\x3c\x02\x03\x3b\xb1"
"\xe9\x41\xa8\x42\x9f\x4d\xdf\xe3\x2a\xab\xee\xf4\x07\x8f\x71"
;
void *exec = VirtualAlloc(0, sizeof original, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, original, sizeof original);
((void(*)())exec)();
当我尝试运行存储在2 distincts阵列相同的shellcode我得到一个访问冲突:
unsigned char part1[] =
"\xd9\xee\xd9\x74\x24\xf4\x58\xbb\xa6\xfb\x51\x8f\x33\xc9\xb1"
"\x62\x83\xe8\xfc\x31\x58\x16\x03\x58\x16\xe2\x53\x07\xb9\x0d"
;
unsigned char part2[] = "\x9b\xf8\x3a\x72\x12\x1d\x0b\xb2\x40\x55\x3c\x02\x03\x3b\xb1"
"\xe9\x41\xa8\x42\x9f\x4d\xdf\xe3\x2a\xab\xee\xf4\x07\x8f\x71";
//build the final shellcode array
unsigned char * concatenation = (unsigned char*)malloc(sizeof (part1)+sizeof(part2)+1);
//concatenation
memcpy(concatenation, part1, sizeof part1);
memcpy(concatenation + sizeof part1 , part2, sizeof part2);
//allocationg memory and running it
void *exec = VirtualAlloc(0, sizeof concatenation, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, concatenation, sizeof concatenation);
((void(*)())exec)();
我试图让第二个例子工作,但我得到了访问冲突错误。 我做错了什么? 谢谢。
UPDATE
此以下阿兰上校三十二个建议修改后的代码,我现在得到以下错误: “TEST.EXE引发了breakpoin吨”
unsigned char part1[] =
"\xd9\xee\xd9\x74\x24\xf4\x58\xbb\xa6\xfb\x51\x8f\x33\xc9\xb1"
"\x62\x83\xe8\xfc\x31\x58\x16\x03\x58\x16\xe2\x53\x07\xb9\x0d"
;
unsigned char part2[] = "\x9b\xf8\x3a\x72\x12\x1d\x0b\xb2\x40\x55\x3c\x02\x03\x3b\xb1"
"\xe9\x41\xa8\x42\x9f\x4d\xdf\xe3\x2a\xab\xee\xf4\x07\x8f\x71";
unsigned char * concatenation = (unsigned char*)malloc(sizeof (part1)+sizeof(part2));
memcpy(concatenation, part1-1, sizeof part1);
memcpy(concatenation + sizeof part1 , part2, sizeof part2);
printf("%d", sizeof(original));
void *exec = VirtualAlloc(0, sizeof (*concatenation), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, concatenation, sizeof(*concatenation));
((void(*)())exec)();
工作代码:
unsigned char * concatenation = (unsigned char*)malloc(sizeof (part1)+sizeof(part2));
memcpy(concatenation, part1, sizeof part1);
memcpy(concatenation + sizeof part1-1, part2, sizeof part2);
void *exec = VirtualAlloc(0, sizeof(part1) + sizeof(part2), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, concatenation, sizeof(part1)+sizeof(part2));
((void(*)())exec)();
答
字符串文字以nul结尾,终止nul字节由sizeof
计数。因此,当使用2阵列版本时,最终阵列中间有一个空字节。
如果更改
memcpy(concatenation + sizeof part1 , part2, sizeof part2);
到
memcpy(concatenation + sizeof part1 - 1, part2, sizeof part2);
,我认为它应该工作。
正如第三十二上校指出的那样,sizeof concatenation
也有错误。
'sizeof concatenation'是一个指针的大小,因为'concatenation'是一个指针。 –
你的问题是什么? – fuz
完成,对不起:)。 – isoman