【问题标题】:Automatic insertion of checksum guards自动插入校验和保护
【发布时间】:2016-03-04 17:59:32
【问题描述】:

作为我项目的一部分,我必须插入部分代码(称为校验和保护)来保护某些功能。这个过程必须是自动化的,即我需要编写一个脚本来将这些警卫插入到一个程序集中。我确实有警卫模板,我不知道如何继续。

如何编写一个 shell 脚本来将代码插入从 C 源文件生成的汇编文件中?

编辑:

这是我正在尝试实施的论文。 cerias.purdue.edu/assets/pdf/bibtex_archive/2001-49.pdf 作者提到他们已经修改了二进制文件以插入警卫,但这似乎很难。于是,我想到了修改汇编代码。

这是一个守卫模板:

guard:
      add ebp, -checksum
      mov eax, client_addr

for:
      cmp eax, client_end
      jg end
      mov ebx, dword[eax]
      add ebp, ebx
      add eax, 4
      jmp for
end:

其中 client_addr 和 client_end 分别标记要保护的代码的开始和结束。

我意识到我对论文的理解并不完整,我仍然不清楚各种问题,但我正在努力弄清楚。

如何将各种功能(保护)作为 shellscript 的输入?

  1. 我可以将函数的名称作为字符串给出。
  2. 我可以给出函数的开始和结束地址(使用 gdb 找到)。

但是在插入校验和保护之后,地址会改变,所以我认为给出名称会更好。 是这样吗?

我是 SO 新手,因此仍然需要学习很多关于发布问题的正确方法的知识。 但是谢谢你帮助和指导我。

【问题讨论】:

  • 如果 checksum guard 是指保护函数免受堆栈溢出攻击,那么通常称为 stack canary。有一个实现示例(用于 C)here.
  • 你描述了一个任务,你没有问一个问题。你需要回到给你这个任务的人那里。并挑战他,如前所述,这是一种可能在管理者耳中听起来合理的功能。它不是。询问“你是什么意思”是你的工作,而不是我们的工作。
  • 你的意思是当你使用-fstack-protector-strong时像gcc插入?那只是写入和读取一个标记值;它不校验任何东西。你到底在校验和/CRCing/散列什么?
  • @PeterCordes 我正在对部分代码(即指令)应用校验和。我将遍历要保护的函数,一次获取一条指令并将其(操作码)存储在寄存器中并在其上应用函数(XOR、ADD 等)以获得值(键)。现在,如果有人篡改代码,则该值将与“密钥”不同。因此,我会知道它已被篡改。问题是我需要从用户那里获取要保护的功能,然后执行脚本以在适当的位置插入校验和保护。
  • 这是我正在尝试实施的论文。 cerias.purdue.edu/assets/pdf/bibtex_archive/2001-49.pdf

标签: shell assembly checksum


【解决方案1】:

自动执行此操作可能是一个真正的挑战,尽管我认为这是不可能的。

在结构化语言中,(例如,通过解析和计算 C 中的大括号)查找函数的开始或结束位置相对容易,因此应该在哪里插入函数序言和结尾。

在汇编程序中,这是不可能的 - 标签不一定是函数的开头,而“ret”不一定是结尾。

最好的办法是为序言和尾声构建自己的宏并手动插入它们。

您的问题中的一些弱提示使我认为您正在使用的汇编代码可能是从 C 编译器生成的 - 在这种情况下,实际上可以通过分析发出的 asm 代码是否可以重新构造 C功能边界。

经过一些澄清后编辑:

我不太明白为什么这需要在汇编程序中完成,以及为什么需要在编译后生成的 .asm 文件中完成 - C 就可以了,而(简单)保护代码的片段可以简单地注入一个宏(可能可能使用内联汇编)。总而言之,如果您在原始资源中进行操作,那会容易得多。而且,为了让编译器生成 asm 源代码,您还需要访问 C(或其他)源代码。

在另一条评论中,您说“他们正在修改二进制文件本身并添加警卫。” - 将一些东西插入二进制文件是一项相当复杂的任务——你将代码移动到更高的地址,需要首先找到该代码的所有调用者,然后调整地址。甚至病毒程序员也不会这样做:)。他们用 jsr 指令将现有代码替换为放置在二进制文件末尾的“背包”。我认为链接论文中的图片有点误导。

【讨论】:

  • 是的,要保护的代码是C代码。我对这个问题做了一些修改。你能看看吗?我对如何获取要保护的函数的输入(到我的 shell 脚本)有疑问?
  • 我已经提到了我试图在问题中实施的论文。他们正在修改二进制文件本身并添加警卫。组装起来不是更容易吗?
  • 您能否建议我应该使用哪种混淆技术来防止我的保护模板被反汇编二进制文件的攻击者轻易识别?
猜你喜欢
  • 2016-07-28
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多