Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

reverse engineering: 综述 #207

Open
wsxk opened this issue Sep 1, 2024 · 0 comments
Open

reverse engineering: 综述 #207

wsxk opened this issue Sep 1, 2024 · 0 comments

Comments

@wsxk
Copy link
Owner

wsxk commented Sep 1, 2024

https://wsxk.github.io/re/

  1. 什么是逆向工程
    在讲逆向工程前,先说说正向工程,正向工程指的是你编写一个程序的过程,包括确定要写什么程序,开始写程序,编译程序,执行程序
    在这个过程中存在信息损失

在design和code之间,你或许会忘记是谁写的程序

在compile和assemble之间,会丢失代码注释、变量名称、函数名称、结构体数据、有时还会丢失这个算法(optimization)

把正向工程中丢失的信息,通过人的一些努力工作,还原信息,这个过程就叫做逆向工程
这项技术的核心是:how do we reverse the design from the binary(我们如何从二进制逆向出设计思想)

  1. 函数和栈帧
    2.1 什么是程序

    一个程序(program)由很多个模块(module)组成

    一个模块(mudole)由很多个函数(functionality)组成

    一个函数(functionality)包含了很多块(block)

    块中有很多条指令(instruction)

    指令(instruction)主要用来操作变量(variables)和数据结构(data structures)

在逆向过程中,module通常是以lib的形式呈现,即动态库和静态库,开发人员极大程度的依靠库函数。
在逆向时需要关注库的精细手册,在逆向时把库函数排除在外,专心逆向主要逻辑
函数就是指实现好的某种功能,通常每个函数的实现都有明确的目的
例如获取一些数据,分发功能,etc.
一开始,函数可以单独逆向,之后就可以了解函数们是如何被组合的
函数可以通过graph(图)表示,graph由很多block(块)和很多条edge(边)构成
block就是计算机执行的指令(instruction)的集合,block由edge连接

2.2 栈帧
每个function序言和结语的指令都很类似:
Set up the stack frame.
Tear down the stack frame
开辟栈帧的主要目的是在栈中给每个函数开辟一段空间用于存放局部变量!(但不是必须的)
在一个elf文件中,有3个段被用来存放数据:
.data:
used for pre-initialized global writable data (such as global arrays with initial values)

.rodata:
used for global read-only data (such as string constants)

.bss:
used for uninitialized global writable data (such as global arrays without initial values)

但是这3个段都被用来存放全局变量,对于局部变量,一般都放在栈中,栈是一段用来存储局部变量和函数调用上下文的空间,采用后进先出的方式(即后向增长)
顺道一提,程序的环境变量也是存放在栈中的

gcc编译时,可以通过-fomit-frame-pointer选项取消栈帧的使用

2.3 数据
总结一下,一个程序(program)中用来存放数据的空间有5处:
.data:
used for pre-initialized global writable data (such as global arrays with initial values)

.rodata:
used for global read-only data (such as string constants)

.bss:
used for uninitialized global writable data (such as global arrays without initial values)

stack:
used for statically-allocated local variables

heap: used for dynamically-allocated (malloc()ed) variables.

  1. 静态分析工具
    Static (as opposed to dynamic) reverse engineering: analyzing a program at rest
    静态分析工具里有很多好用东西:
    kaitai struct (https://ide.kaitai.io/): file format parser and explorer

nm: lists symbols used/provided by ELF files

strings: dumps ASCII (and other format) strings found in a file

objdump: simple disassembler

checksec (https://github.com/slimm609/checksec.sh): analyzes security features used by an executable

当然,上述只能看到二进制文件的某些内容,要想分析程序逻辑,还需要反汇编器!
Commercial:
IDA Pro: the

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant