静态反逆向工程

1. 反汇编算法

1.1. 线性反汇编算法

遍历代码段,连续反汇编

1.2. 面向代码流的反汇编算法

根据代码流,建立一个需要反汇编的地址列表,然后再反汇编

  • 大多数面向代码流的反汇编器会首先处理条件跳转的false分支
  • 大多数面向代码流的反汇编器会首先反汇编紧随call调用的字节,其次是call调用位置的字节

2. 花指令

目的:破坏线性及递归静态反汇编

2.1. 同一字节用于多个指令(单层、多层复合)

1
label    jmp label + 1

2.2. 条件互补型永真跳转

1
2
jz label
jnz label

2.3. 制造固定值型永真跳转(可以利用API返回值的固定规律永真跳转(比如返回句柄的情况下,返回值一定是4的倍数))

1
2
xor eaxeax
jz label

2.4. 自封闭代码块,即不影响程序执行流的垃圾指令,无用循环

1
2
dec eax
inc eax

2.5. 利用函数指针挫败call地址识别

1
2
mov eax,label
call eax

2.6. 滥用返回指针

1
2
push label
retn

2.7. 滥用SEH

  • 安装SEH
  • 触发SEH
  • 卸载SEH(需要额外卸载两个系统安装的SEH、注意平衡堆栈)
  • 执行功能代码

3. 加密与多态

  • 动态解密
  • 动态破坏前序代码
  • 对代码进行多态处理

4. 反反编译技术

4.1. 破坏堆栈平衡

Hex-Rays反编译器在函数堆栈不平衡的情况下会拒绝反编译函数,显示为sp analysis failed,所以可以通过手动破坏堆栈平衡来反反编译。

  • push + retn其实等效于jmp,但是会让反编译器误认为函数结束
  • 在永不执行的代码处调整栈指针
1
2
3
jmp label
add esp,100
label

4.2. 返回劫持

即在返回之前移动栈来构造一个ROP链( Stack pivot)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//    gcc -o return return.c -masm=intel
#include <stdio.h>
void evil() {
    puts("Evil Code");
}
extern void gadget();
__asm__ (".global gadget        \n"
         "gadget:               \n"
         "  pop       rax       \n"
         "  mov       rsp, rbp  \n"
         "  call      rax       \n"
         "  pop       rbp       \n"
         "  ret                 \n");
void * gadgets[] = {gadget, evil};
void deceptive() {
    puts("Hello World!");
    __asm__("mov rsp, %0;\n"
            "ret"
            :
            :"i" (gadgets));
}
void main() {
    deceptive();
}

4.3. 滥用noretrun函数

反编译器会丢弃exit、abort这些noreturn函数之后的任意代码,可以通过欺骗反编译器,让其认为一个非noreturn函数为noreturn函数来使得反编译器出错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//gcc -o noreturn noreturn.c
#include <stdio.h>
#include <stdlib.h>
void deceptive() {
    puts("Hello World!");
    exit(0);
}
void ignore() {
    puts("Evil Code!");
    srand(0);
}
void main() {
    deceptive();
}

以上代码编译完成后,将plt表中srand函数与exit函数的序号对调,即可达到欺骗反编译器的目的。

信息收集

[TOC]

1. Whois信息和Whois反查

2. DNS信息

3. 子域名、旁站、C段

4. 备案信息

5. 绕过CDN获取网站真实IP

  • 二级域名法(一般网站不会所有的二级域名放CDN,因此我们可以利用这点来获取网站的真实ip )
  • 多地ping法(由CDN的原理,不同的地方去Ping服务器,如果IP不一样,则目标网站肯定使用了CDN)
  • nslookup法(找国外的比较偏僻的DNS解析服务器进行DNS查询,因为大部分CDN提供商只针对国内市场,而对国外市场几乎是不做CDN,所以有很大的几率会直接解析到真实IP)
  • 查看邮件法(通过查看邮件原文来确定ip地址,CDN总不会发送邮件吧)
  • RSS订阅法(RSS原理于邮件法差不多)
  • 查看历史解析记录法(查找域名历史解析记录,域名在上CDN之前用的IP,很有可能就是CDN的真实源IP地址,http://toolbar.netcraft.com)
  • 利用网站漏洞(XSS、命令执行、SSRF、php探针、phpinfo页面等)

6. 网站端口和指纹信息

6.1. 原理

  • 指定路径下指定名称的js文件或代码。
  • 指定路径下指定名称的css文件或代码。
  • <title>中的内容,有些程序标题中会带有程序标识
  • meta标记中带的程序标识
    • <meta name=”description”/>
    • <meta name=”keywords”/>
    • <meta name=”generator”/>
    • <meta name=”author”/>
    • <meta name=”copyright”/>
  • display:none中的版权信息。
  • 页面底部版权信息,关键字© Powered by等。
  • readme.txt、License.txt、help.txt等文件。
  • 指定路径下指定图片文件,如一些小的图标文件,后台登录页面中的图标文件等,一般管理员不会修改它们。
  • 注释掉的html代码中<!–
  • http头的X-Powered-By中的值,有的应用程序框架会在此值输出。
  • cookie中的关键字
  • robots.txt文件中的关键字
  • 404页面
  • 302返回时的旗标

6.2. 方法

  • Nmap
  • wappalyzer插件
  • 云悉
  • whatweb
  • CMS指纹识别
  • 御剑指纹识别
  • Webrobot工具
  • 数据包响应头

7. 敏感信息泄露

7.1. 列表

  • Git
  • hg/Mercurial
  • svn/Subversion
  • bzr/Bazaar
  • Cvs
  • WEB-INF泄露
  • 备份文件泄露、配置文件泄露

    7.2. 方法

  • 御剑
  • Google
    • “” //双引号表示强制搜索
    • - //表示搜索不包含关键词的网页
    • | //或者的意思
    • site //返回所有于这个域名有关的网页
    • intext //搜索到的网页正文部分包含关键词
    • intitle //搜索到的网页标题包含关键词
    • cache //搜索关于某些内容的缓存
    • definne //搜索某个词语的定义
    • filetype //搜索指定的文件类型
    • info //查找指定站点的一些基本信息
    • inurl //搜索包含关键词的URL
    • link //可以返回所有和baidu.com做了链接的URL
  • BBScan
  • GSIL
  • AWVS
  • BurpSuite
  • Github
  • wwwscan
  • 社交平台(QQ群、文库、求职网)
  • robots.txt、crossdomin.xml、sitemap.xml、源码泄漏文件、/WEB-INF/

8. 网络空间搜索引擎

9. 探测waf

  • 手工(提交恶意数据)
  • WAFW00F
  • Nmap( http-waf-detect、http-waf-fingerprint)

10. 收集域名邮箱

可以用于撞库、爆破、弱口令攻击

  • 说明文档、网站页面、网站发表者以及留言板信息处
  • teemo,metago,BurpSuite,awvs,netspker 或者 google 语法
  • 搜索相关 QQ 群收集相关企业员工的社交账号

CentOS修改SSH端口

1. 关闭selinux

修改/etc/sysconfig/selinux,将SELINUX=enforcing改为SELINUX=disabled,重启生效

2. 修改端口

修改/etc/ssh/sshd_config,将# Port 22修改为Port xx,重启SSH服务生效

3. 修改iptables

修改/etc/sysconfig/iptables,加一行-A INPUT -m state --state NEW -m tcp -p tcp --dport xx -j ACCEPT,重启iptables服务生效

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×