Skip to content

Week 9 - Reverse Engineering

标签
Sys
Security
OS
Linux
C
network
字数
771 字
阅读时间
4 分钟

Code Can be Data

在我们前面看到的网络攻击中,比如SQL injection,XSS(跨站脚本),Buffer overflow中,都是让服务器接收数据Data,而服务器误将Data运行,Data就成了Code

而反过来,Code也可以是Data。已经编译好的Binary code,或者executable code也可以被编辑。

Binaries

Binaries被写为汇编语言,比Java byte code要底层的多,Assembly在一个cpu上能运行,在另一个上可能就不能。

Ghidra是一款开源的免费反编译工具。IDA pro是收费的

Some x86 Commands

x86和8086的汇编基本没区别

PUSH, POP, CALL(execute function) JMP, RET,RETN,RETF(end a fund and restart calling code), MOV

在x86架构中,栈底指针为EBP,顶为ESP,x86的栈是反过来的,栈底内存地址更高,栈顶更低。一个cell为4byte。

当你push一个数之后,又pop,数据并没有被删除,而是ESP会向栈底移动一个cell(4)

对于带调用函数的程序,栈长这样。注意,下面是栈底,但内存高,从下到上调用参数的反过来的,EBP指向原EBP地址,也就是C的下面。

当函数运行结束后,栈就成了这样:

顺序

x86的assembly并没有反过来,mov eax, [esp+1Ch]就是吧右边移到左边。

Flags

  • ZF:Zero Flag, 1 if result is 0
  • SF: Sign Flag, 1 if result is negative
  • OF: Overflow Flag, 1 if operation overflowed

Compare and Test

  • CMP a b: a-b and set flags
  • TEST a b: a and b and set flags

Jump

  • JZ和JE一样:ZF=1就跳
  • JNE和JNZ一样:ZF=0就跳
  • JL:if less than,SF=1且OF!=1就跳

Patterns

P1:

wasm
mov eax, [esp+1Ch]
add [esp+1Ch], eax

P2:

wasm
cmp [esp+1Ch], 3
jle loc_80483DF

P3:

wasm
mov [esp+4], eax
mov [esp], offset s1 ;"exit"
call _strcmp

第一行,存数据到栈上

第二行,存exit到栈上

第三行,call函数

常用的逆向密码技巧

  • 使用strings,查看所有用到的string,找到像密码的试一试就可以了
  • 使用debugger找到key test的过程并检查寄存器中的值
  • 把JEQ和JNEQ替换一下,就可以运行到密码正确的分支
  • 跳过整个执行check密码的代码

逆向防御

  • 动态构建代码
    • attacker还是能运行代码
  • 对binary加密
    • 你的程序肯定包含这key的明文,attacker还是能找到它
  • 混淆代码,例如混合数据和代码,使其不清楚哪个是哪个
    • 可以将攻击速度减慢数月甚至数年!
  • 使用online activation
  • 需要在线内容
  • 基于硬件的保护,即把代码的一部分存储和运行在防篡改的硬件中。

贡献者

文件历史