2.接下来运行程序观查一下,看到有请按任意键继续,可以猜到调用了系统函数:
3.去Ghidra中,Search->For Strings->中查找pause。
4.找到后按g输入地址过去,看到右边交叉引用,双击就能找到使用的地方,定位到关键函数(这个程序简单,直接看main函数也许,这里是为了学习用法)
5.使用Windows->Function Graph 可以看到该函数地图形化显示
6.去反编译窗口看看伪代码,在对比下ida反编译后的代码,可以看到IDA的反编译功能更多强大一些,Ghidra有很多变量识别成了未定义。
_puts(&.rdata);
_scanf("%s",&local_32);
DectoHex(local_14,(char *)&local_23,0xf);
iVar1 = _strcmp((char *)&local_32,(char *)&local_23);
if (iVar1 == 0) {
_puts(&DAT_00406054);
}
else {
_puts(&DAT_0040605d);
}
_system("pause");
return 1;
=======IDA======
puts(&Buffer);
scanf("%s", Str1);
DectoHex(v7, (char *)hex, 15);
if ( !strcmp((const char *)Str1, (const char *)hex) )
puts(&byte_406054);
else
puts(&byte_40605D);
system("pause");
return 1;
7.Ghidra还可以对数据,区段,函数进行管理,例如这里可以直接查看DOS头文件,不需要借助其他工具。
1.哪个工具简单好用就用哪个,目前对小菜鸟而言,还是IDA香,主要是用得久,知道的功能多,也熟悉。
2.Ghidra作为开源工具,功能丰富,也有一定的优点,加载速度好像没用IDA快,可能是读取的内容太多了。
3.至于为什么自己写了那样一段代码,还不是前天10进制转16进制用c没写出来,当时用java操作的,这次就当巩固C知识了。
伯克利包过滤器(Berkeley Packet Filter)是一个 Linux kernel 中用以对来自于链路层的数据包进行过滤的架构,其位于内核中的架构如下图所示:
相比起传统的数据包过滤器而言,BPF 在内核中实现了一个新的虚拟机设计,通过即时编译(Just-In-Time compilation)技术将 BPF 指令翻译为 BPF 虚拟机的字节码,可以高效地工作在基于寄存器结构的 CPU 上
Linux kernel 自 3.18 版本起提供了扩展伯克利包过滤器(extended BPF,即 eBPF
),其应用范围更广,能够被应用于更多的场景,原来的 BPF 被称为 classic BPF(cBPF),且目前基本上已经被废弃,Linux 会将 cBPF 字节码转化为 eBPF 字节码再执行
作为一个位于内核层面的虚拟机,eBPF 无疑为攻击者提供了一个相当大的新攻击面,因此也成为近几年内核利用中的“大热门”
Linux 下 eBPF 的整体架构如下图所示:
verifier
对字节码程序进行安全性检查,通过检查后便通过 JIT 编译运行,eBPF 程序主要分为如下类型:
kprobes
:内核中的动态跟踪,可以跟踪至内核中的函数入口或返回点uprobes
:用户空间中的动态跟踪,与 kprobes 不同的是跟踪的函数位于用户程序中tracepoints
:内核中的静态跟踪perf_events
:定时采样与 PMC在 eBPF 字节码被传入到内核空间后,其首先需要经过 verifier
的安全检查,之后才能进行 JIT 编译,verifier 主要检查以下几点: