上面是我之前的问题,当shell代码在源代码中时,它涉及从ac程序中清除shellcode.它由Carl Norum解决,并且由于记忆保护.我有一个不同的问题但是很相似.我没有将shell代码放在同一个文件中,而是想从.txt文件中读取shell代码并执行它.下面我尝试将一段内存标记为PROT_EXEC,并将.txt文件的内容读入其中并执行.但是它不起作用,我得到了同样的错误,KERN_PROTECTION_FAILURE,我尝试使用mprotect和mmap将一段内存标记为PROT_EXEC.
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
int (*ret)();
unsigned char* buf;
int main()
{
FILE* file;
file = fopen("text.txt", "rb");
fseek(file, 0, SEEK_END);
unsigned int len = ftell(file);
fseek(file, 0, SEEK_SET);
buf = valloc(len);
fread(buf, 1, len, file);
fclose(file);
mprotect(buf, len, PROT_EXEC);
// I also tried mmap, but same error.
/* void *ptr = mmap(0, 1024, PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
if (ptr == MAP_FAILED)
{
perror("mmap");
exit(-1);
}
memcpy(ptr, buf, 1024);*/
ret = buf;
ret();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我正在读的text.txt文件,它与我上一个问题的hello world代码相同:
\x55\x48\x89\xe5\xeb\x33\x48\x31\xff\x66\xbf\x01\x00\x5e\x48\x31\xd2\xb2\x0e\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x04\x4c\x89\xc0\x0f\x05\x31\xff\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x01\x4c\x89\xc0\x0f\x05\x48\x89\xec\x5d\xe8\xc8\xff\xff\xff\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x0a
Run Code Online (Sandbox Code Playgroud)
由于我将txt文件的内容复制到PROC_EXEC内存中,我不明白为什么我得到KERN_PROTECTION_FAILURE.
基于我对上一个问题的回答,这是一个解决方案:
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <stdlib.h>
int main(void)
{
FILE *file = fopen("text.txt", "r");
unsigned char *buf;
int length = 0;
struct stat st;
int v;
// get file size and allocate. We're going to convert to bytes
// from text, so this allocation will be safely large enough
fstat(fileno(file), &st);
buf = valloc(st.st_size);
while (fscanf(file, "\\x%02x", &v) == 1)
{
buf[length++] = v;
}
fclose(file);
mprotect(buf, length, PROT_EXEC);
int (*ret)() = (int (*)())buf;
ret();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从您的程序中唯一需要改变的是将ASCII文本转换为二进制数据的循环.我用的fscanf是权宜之计,但那很脆弱.
| 归档时间: |
|
| 查看次数: |
3307 次 |
| 最近记录: |