Shellcode对反汇编提出了某些挑战。它通常会自我修改,跳转到堆栈(可能会放置self代码的地方),并且依赖于标准反汇编工具不关注的某些不寻常的技巧。
考虑到这一点,有哪些工具可用于分解和分析外壳代码?
发布于 2012-08-21 06:03:54
利贝母。是免费的。对于Linux,但能够分析win32外壳代码。
痉挛。用Python实现,看起来非常有趣。
发布于 2012-08-21 07:45:10
因为外壳代码只是一个原始的指令块,所以这些工具并不适合。
瓦特?可执行文件也只是原始的指令块!不是真的。好吧,也许里面有一些用于PE/ELF头之类的数据,或者只是普通的程序数据,但是数据和指令是相同的二进制。更重要的是,可执行文件的部分被标记为(文本、数据),这样操作系统就知道应该把什么当作什么来处理。
对于演示程序,可以使用任意一组汇编程序并键入:
nasm -f bin <asmfile.asm>这绝对不需要额外的工作条,将汇编程序指令转换为操作码,并将其写入二进制文件中。这就是编写引导加载程序之类的方法。
现在,如果您想分析一些外壳代码,有多种方法可以做到这一点。首先,您可以使用一个线束:
#include <stdio.h>
char shellcode[] = { ... };
int main()
{
int (*function)() = shellcode;
function();
}瞧,你已经离开了--只要让gdb或者类似的东西一步一步就行了。当然,如果您想静态地分析特定的shell代码,那么也有一种方法:
#include <stdio.h>
char shellcode[] = { ... };
int main()
{
FILE* f = fopen('test.bin', 'wb');
fwrite(shellcode, sizeof(shellcode), f);
fclose(f);
}现在您可以使用二进制blob了。实际上,为了将代码加载到测试工具(也就是逃避它)中,您可能不得不做相反的操作。
如果你在找工具,我建议你使用x86上网本。基本上,它可以归结为选择一个或多个你负担得起的,并有一个游戏。
除非外壳代码包含反调试措施(请记住,它受空间限制),否则运行时调试器与测试工具将工作得很好。
发布于 2012-11-22 12:20:14
您可以在原始二进制外壳代码文件中使用scdbg来获取它使用的所有api的运行时日志。执行是在libemu仿真环境中完成的。如果-d选项检测到任何内存修改(自解码),它将在内存完成后创建一个转储。该工具还支持定位外壳代码的起始偏移量(在ROP前缀的情况下),以及一个集成的(基本的)调试外壳。有一个youtube视频可以看到它的行动。
http://sandsprite.com/blogs/index.php?uid=7&pid=152
http://www.youtube.com/watch?v=jFkegwFasIw
您可以将转储内存打开到IDA反汇编程序,后者可以将其作为原始的32位代码。您还可以设置基址(通常不是必要的),如果必须使用内置的脚本功能,则可以修改代码。
https://security.stackexchange.com/questions/18958
复制相似问题