Modern Binary Exploitation是教授二进制漏洞和逆向工程方面的实战攻击技巧的课程,课程安排结合课程教授和动手实践提供学生探索快速发展的安全领域中常用思路和技巧的机会。这里记录笔者根据课程网站学习的 lecure 1 关于逆向以及其常用工具的知识,以供参考和查阅。课程网址:Modern Binary Exploitation
lecure 1:逆向及常用工具
主要思路:(1)静态 + 动态调试结合 ;(2) 源程序 + 修改程序并重;
课程介绍一些在常用操作系统(Linux、Windows)平台下的反汇编工具,并通过具体的实例来介绍工具的使用方法。
Linux平台:命令行指令(command)
Windows平台:反汇编程序的可执行文件(.exe)
静态调试:
Linux:
xxd:
十六进制编辑/查看工具.可用于十六进制序列的转换以及反汇编操作。(wxHexEditor,提供图形界面的操作)
xxd [-options] inputfile outputfile
//从标准输入或指定的文件中读取数据并输出其十六进制表示,也可以用于转换十六进制数据
//如果不指定inputfile或使用 - ,则从stdin读取输入,若不指定outputfile或使用 - ,则输出至stdout
-b //进行二进制数据的转换,而不是十六进制
-c //指定每一行column的字节数,默认16个字节
-g num //将输出的数据每num个字节使用空格隔开,默认num=2,二进制情况下num=1
-l length //输出length个字节后停止
-r //反汇编选项,将十六进制表示转换为二进制流
-p|ps //以连续十六进制串的形式输出。默认每行由十六进制行号开始,以对应的ASCII字符结束
-s ±offset //自输入文件偏移offset长度处开始读取,-offset为自文件末尾偏移offset处开始
-i //以c include style输出
使用示例:
(1)以连续十六进制串输出48个字节,每行20个字节
xxd -l 0x30 -c 20 -ps test.txt
(2)正常输出文件的最后48个字节的内容,每行10个字节,每4个字节用空格隔开
xxd -s -0x30 -c 10 -g 4 test.txt
(3)以c include style输出示例
strings:
输出文件中的可打印的字符串
strings filename
//strings输出指定的文件的内部可打印的字符串序列(至少四字节或指定字节长度的串)
//默认只输出initialized和loaded section部分的字符序列
-a //输出整个文件的符合条件的字符串
-n length //输出长度至少为length的字符序列,默认值为4
-t format //在每个字符序列前输出其在文件内的偏移量,format表示其输出格式,o为8进制,x为16进制,d为10进制
-e //指定字符序列的编码方式
file:
确定文件类型的命令。输出的内容包括文件类型、机器类型、链接情况等。
图示的file指令执行结果包括文件类型ELF 64-bit,运行于x86-64架构,使用动态链接以及所用的编译器版本等信息。
readelf:
输出指定的ELF文件(executable and linkable format,Linux平台下的可执行文件格式)的有关信息,与objdump功能相似
readelf [Options] filename
-a //输出所有相关信息
-h //输出ELF头部(ELF header)中的信息,一般包括ELF头大小、目标文件类型(可重定位、可共享、可执行)、机器类型(IA32)、节头部表的文件偏移(位于文件尾部)和其条目大小和数量
-l //输出节头部表(segment header)中的信息,节头部表包含对文件中各个section位置和大小的描述,每一个节占用一个固定大小的条目(entry)
-s //输出.symtab节符号表中的条目
-r //输出.rel.xx节即重定向节(rellocation section)
-x name/num //以十六进制字节方式展示指定的名称或索引数字指向的节的信息,这里的索引数字为节头部表中的索引顺序
-R name/num //同上,但在重定向节会在重定向后输出
-p name/num //以可打印字符的格式输出指定节内容
查看目标文件的符号表:readelf -s filename
包含有符号条目的偏移(所在节中的节偏移)、所占用空间大小(字节数)、类型(函数、数据、节)、作用域(global/local)、所在节、标志名等信息。
查看目标文件的ELF头:readelf -h filename
objdump:
主要用于反汇编的工具
objdump [Options] filename
//objdump实际上是与readelf命令相似,用于输出指定目标文件的信息,但其最常用的功能为-d选项,用于反汇编工作 -d //反汇编指定的文件
-g //输出目标文件的调试信息(如果存在的话)
-l //通过调试信息将反汇编结果使用文件名和源代码行数标记(如果存在调试信息的话)
Windows
IDA Pro:Windows平台下的反汇编工具
常用的快捷键:(可参考IDA Pro Shortcuts)
快捷键 |
功能 |
空格 |
基础模式与图形模式切换,在代码段可用 |
n |
重命名操作 |
a |
转换为数组,即将选定的单个元素结合在一起 |
; |
添加注释(常用) |
x |
Cross-reference,交叉参考 |
d |
改变解释数据的长度,可在db、dd、dw之间转换 |
u |
取消当前自定义的结构 |
Ctrl + s |
跳转至不同的段中 |
F1 |
使用指南 |
Shift+F12 |
显示字符串(常用) |
Shift+F7 |
显示目标文件的各个section |
Shift+F8 |
显示段寄存器信息 |
Shift+F4 |
显示所有的name |
F5 |
查看伪代码(常用) |
调试相关
F2 |
放置断点(也可单击代码左侧小点,使之变红) |
F9 |
运行 |
F7 |
步入函数内部执行 |
F8 |
步过 |
Ctrl+F7 |
运行至函数结束 |
F4 |
运行至光标处 |