2021年暑期夏令营笔记(day7-day8)
Linux系统调用表
https://github.com/torvalds/linux/tree/master/arch/x86/entry/syscalls
https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md
0x01 Windows平台下的shellcode利用
Windows下的Shellcode
优势:使用起来非常灵活,且易变形
劣势:开发困难
难点:如何动态定位API函数地址
API HASH
https://neil-fox.github.io/Anti-analysis-using-api-hashing/
在常规编程中,只需引入其头文件,便可调用某API函数,编译器在编译过程中会将相关信息编译到PE文件中(这里的相关信息主要是指 MAGE_IMPORT_DESCRIPTORS结构体)。当程序执行时,操作系统会将PE文件映射到内存,这个映射过程包括调用 LoadLibrary加载相应的动态链接库,以及调用 GetProcAddress取所有AP函数在内存中的地址,像这样的dll加载方式,我们称为隐式链接。
ShellCode开源框架
https://github.com/mai1zhi2/ShellCodeFramework
实操
https://uknowsec.cn/posts/notes/shellcode%E5%8A%A0%E8%BD%BD%E6%80%BB%E7%BB%93.html
实战视角
Metasploit & CobaltStrike 的shellcode分析
在APT攻击中,有对现有 shellcode的利用,如海莲花组织利用CS的 shellcode进行攻击,同时,某些APT组织也会开发一些特定的 shellcode
推荐资料:
逆向工程核心原理
Windows核心编程
https://securitycafe.ro/?s=shellcode+development
0x02 加壳
原理: 原程序最开始运行的一段代码是原始入口点,加壳之后只要先把壳代码运行再跳转到入口点,原程序依然正常运行。而在壳代码中就可以对原程序进行加解密等操作。
目的:使反汇编和反编译变得尽可能复杂,“反”出来结果尽可能无意义,甚至根本就“反”不出来。
结果:静态反汇编的代码无意义,需要动态分析。
壳的分类:
1.压缩壳
2.加密壳
3.虚拟机壳
加壳后的区别:
- 入口点不同
- 区段名会变
- 区段大小会变
在32位系统下,操作系统给每一个应用程序都分配了4gb的存储空间(虚拟存储空间),仅仅是exe就不需要考虑这个问
题,但是很多exe会加载动态链接库(.dll)
exe基址:
dll基址:
为什么是需要重定位:
1、对与exe,exe首先会加载到内存,每个文件总是使用独立的虚拟内存空间,这就意味着exe文件就不需要考虑基址重定位的问题
2、对于dll,在一个4gb虚拟内存里有多个dll,不能保证每次都加载到同样的位置,存在被其他dll占用的问题
3、对于系统的dll,实际上不会发生重定位
随机基址(alsr)
恶意代码bypass alsr、bypass dep等等,windows vista之后才有的机制(原因:针对缓冲区溢出的保护机制,从NT6.0开
始使用)
windows7上:程序重启就能随机基址,基址会变化
windows10:重启的系统,基址会变化
开启条件:程序(vs中可以查看)+操作系统(windows7之后)
exe程序开启alsr和没有开启有什么区别?(都能执行)
1、区段数量不一样
2、文件头的characteristic中的重定位信息标志
3、可选头(option header)中的dllcharacteristic的dymaic_base标志
4、区段不一样
如何去掉随机基址?
修改两个字段:
汇编代码知识
一个简单的壳:
- 添加区段
- 在区段中添加跳转到oep的汇编代码
- 修改原程序的oep为添加的区段中的代码的地址
一般情况下加壳的流程:
- 保存寄存器环境
- 加载一些必要的API
- 解密代码和数据
- 修复重定位
- 填充IAT
- 恢复寄存器环境
0x03 脱壳
脱壳的方法
- 寻找原始OEP
- dump内存到文件
- 修复文件
1、esp定律
有了ESP定律,可以方便我们脱掉大多数的压缩壳。
2、单步跟踪
利用OD的单条指令执行功能,从壳的入口一直执行到OEP,最终通过这个OEP将原程序dump出来。然当,在单步跟踪的时候需要跳过一些不能执行到的指令。
3、其他:https://www.52pojie.cn/thread-259984-1-1.html
脱壳相关工具
- OD:动态调试
- ImportRec:修复IAT
- PEID、exeinfo:查壳
脱压缩壳
- Esp定律:
- 步过保存寄存器的指令,在esp寄存器上下硬件断点,然后运行起来,单步几步找到oep
- 使用OD插件Ollydump或者OllydumpEx,转存
- 使用ImportRec修复IAT
脱加密壳
- 解密IAT与脱壳分析
- 脱壳脚本的编写
脱反调试壳
- 搭建异常触发环境
- 分析触发的异常
- 寻找原始OEP
- 寻找写入IAT和获取API地址的点
- 编写脚本修复IAT
- 使用通用导入表修复工具修复IAT引用代码
脱反虚拟机壳
- 修改虚拟机配置
- 对偷取OEP的修复
- 对IAT调用的修复
虚拟机保护壳-VMP
虚拟机保护代码技术是将x86汇编指令转换为字节码指令,并且通过自己设计的解释器去执行字节码指令的一项技术,以达到保护原有指令不被轻易逆向和篡改