如何解决在C的内存中加载长的Shellcode
我希望我的shellcode在x86 arch中运行,但是C中的char数组的限制为〜16k,而我的shellcode更长。我在2个数组上断开了字符串,并开始如下操作:
char n1qwgimnb8i[] = "\x75\x6d\xf2\x34...";
char n1qwgimnb8i1[] = "\x74\xdf\x39\x37...";
void *zx1rwsnvf4l = VirtualAlloc(0,sizeof n1qwgimnb8i + sizeof n1qwgimnb8i1,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
memcpy(zx1rwsnvf4l,n1qwgimnb8i,sizeof n1qwgimnb8i);
memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i,n1qwgimnb8i1,sizeof n1qwgimnb8i1);
CreateThread(NULL,zx1rwsnvf4l,NULL,NULL);
我用cl编译,没有错误,但是当我启动最终的.exe时,它崩溃了。我在做什么错了?
解决方法
char
数组的字符串式初始化,如
char hoge[] = "foo";
在数据末尾自动添加终止空字符,此示例等效于
char hoge[] = {'f','o','\0'};
因此,将在两个数组之间插入一个额外的0x00
字节,这可能会引起麻烦。
行
memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i,n1qwgimnb8i1,sizeof n1qwgimnb8i1);
应该是
memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i - 1,sizeof n1qwgimnb8i1);
(应添加{- 1
,以使副本从原始数据之后立即开始,而不会终止空字符)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。