【发布时间】: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 的输入?
- 我可以将函数的名称作为字符串给出。
- 我可以给出函数的开始和结束地址(使用 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