用户
搜索
  • TA的每日心情
    擦汗
    昨天 20:13
  • 签到天数: 220 天

    连续签到: 1 天

    [LV.7]常住居民III

    i春秋签约作家

    Rank: 7Rank: 7Rank: 7

    42

    主题

    800

    帖子

    98

    魔法币
    收听
    3
    粉丝
    13
    注册时间
    2015-11-20

    核心白帽i春秋签约作者积极活跃奖

    发表于 2017-5-10 00:04:21 154346
    一、介绍:
    什么是附加数据(overlay)摘自Lenus大神
    实际当中的overlay
    其实,overlay虽然大家在脱壳当中觉得很陌生,但是他离我们并不遥远。在我们平时使用的软件当中,有一些软件要处理一些数据流文件,比如 winamp。当我们下载了mp3文件(数据文件),没有播放器是不可能播放的,与此相关的还有很多,比如txt文件和notepad的关系也差不多。而这些数据文件被单独的保存在硬盘上,当我们使用notepad的打开功能的时候,就可以去读取数据文件里面的东西了。

    overlay又是什么意思呢?
    他其实真正的意思就是取消打开功能,将这些需要读取的数据放到pe文件的后面,让程序自动的运行打开的功能。这样的功能就变成了一个notepad的程序对应只能打开一个文件。

    最典型的就是一些软件可以把一些数据流文件生成exe文件,比如一些mp3生成器,flash生成器,以及我们用来做动画的S-demo。他们的作用就是将数据对pe进行捆绑。(这样做的结果也就是为什么我们对这些文件用UPX等pe压缩工具却不能压缩他的原因
    在我们对pe文件的overlay进行分析,普及一下文件映射的知识。在pe里面,有所谓的文件偏移RA,文件偏移大小RS和与其对应的虚拟地址偏移VA,虚拟地址偏移大小VS。

    我们要深刻的理解以上的概念不是我这篇文章能说清楚的,但又是搞overlay必须得弄清楚的,于是我简单的说明一下。
    在我们的磁盘上的pe文件里面,排列着的数据在运行的时候将被影射到内存空间。他们将被怎么映射呢?举个例子:

    例1:

    一个pe文件中只有两个区段(pe head不算)
    第一个区段是.text VA=401000 VS=1000RA=200 RS=100
    第二个区段是.data VA=402000 VS=1000RA=300 RS=100
    假设我们打开winhex看到在文件偏移300处的情况是这样的:
    RA=2FF 处的数据是12RA=300处的数据是34

    现在当pe文件装到内存中,那么会出现什么结果呢。
    1.文件偏移中的200开始的100个字节将被影射到内存的401000开始的100个字节,后面的F000个字节将用0填充。
    2.文件偏移中的300开始的100个字节将被影射到内存的402000开始的100个字节,后面的F000个字节将用0填充。

    也就是说,在磁盘是上相邻的两个数据12和34,在内存空间中将分开得老远,12在40102FF处,而34却在402000处。

    当然这只是我自己随便举的一个极端的例子,实际上由于文件的对齐机制在磁盘上每个段的结束都是填充了大量的0

    为什么要讲这些
    因为区段是一般将会被映射到内存的,如果上面的例子中。将.data区段去掉。那么在磁盘上就将会留下从RA=300到RA=400其大小为100的数据,不会被影射到内存中。而这部分数据就将被认为是附加数据-overlay。

    二、实战
    【加壳方式】: UPX Inliner v1.0 by GPcH
    【使用工具】: OllyDbg
                  PEID
                  Lord PE
                  WinHex
                  Imp Rec
                  Hex Wrokshop v6.5.1
    【声明】: 主要展现脱壳后附加数据的快速解决,没有其他目的。  
    ①、PEID看一下壳
    image001.png
    ②、DetectItEasy V1.0看一下什么编译器
    image002.png
    然鹅,PE区段被改了,并看不出来
    既然是UPX的壳,按照之前的文章步骤,脱壳吧
    1、载入OD
    2、
    image004.png
    很明显是UPX的壳,ESP定律走起~~(单步跟踪、模拟跟踪都可以的)

    3、F8单步往下走,F9运行程序,F8单步走,走,
    4、
    image006.png
    来到这,熟悉吧,右键分析-从模块中删除分析

    5、
    image008.png
    来到了熟悉的OEP,对照oep看一下是什么语言

    6、
    image010.png
       Vc++ 6.0的编译器

    7、到达oep之后,下一步来脱壳
    8、
    image012.png
    复制oep,3831,再用Lordpe脱壳

    9、
    image014.png
    修正镜像大小,在转存一下。

    10、
    image016.png
    再用  修复,不管能不能运行都得修复一下

    11、修复完成后看一下壳子,打开程序运行一下

    12、显示是vc++6.0,说明程序已经脱壳完成了
    image018.png
    13、运行一下
    image019.png
    14、OH!Shit!!
    15、不出所料,因为刚开始就出现了这个东西
    image020.png
    敲黑板!!!!
    1、overlay只是数据它是不映射到内存的,它将被程序以打开自己的方式来读取数据
    2、只要不是区段里面包括的文件的大小,将被视为overlay.

    那怎么办呢,重点来了。。。。。。。。。。。。。
    1、神器winhex
    2、 image021.png 这个东西
    3、将未脱壳的程序放进去
    4、
    image022.png

    5、首先,把滑轮拖到最底部,依次往上找,找到第一处很多00的地方
    6、
    image024.png

    7、选择00结束第一个字符(alt+1)到末尾最后一个字符(alt+2)
    8、
    image026.png

    9、复制下来,关闭,拖入脱壳完成的文件
    10、一直拉到最后,也是00很多的地方
    11、
    image028.png

    12、在末尾粘贴未脱壳程序的那段
    13、
    image030.png

    14、保存文件到脱壳后修复的文件
    15、
    image032.png

    16、有的在win7/xp情况下保存完成后可能会出错,版本不同
    17、这是推荐使用Hex workshop ,使用方法与winhex一样,在吾爱破解工具包里都有
    18、 image034.png 运行试一下,无错误提示即可
    使用lordpe,用PE编辑器打开加壳程序
    image035.png
    依次打开区段,看到区段表

    ☆【重要属性介绍】
    (1)Name : 这是一个8位的ASCII(不是Unicode内码),用来定义块名,多数块名以.开始(如.Text),这个.实际上不是必需的,注意如果块名超过了8个字节,则没有最后面的终止标志NULL字节,带有$的区块的名字会从编译器里将带有$的相同名字的区块被按字母顺序合并。
    (2) VirtualSize: 指出实际的,被使用的区块大小,是区块在没有对齐处理前的实际大小.如果VirtualSize > SizeOfRawData,那么SizeOfRawData是可执行文件初始化数据的大小
    (SizeOfRawData – VirtualSize)的字节用0来填充.这个字段在OBJ文件中被设为0.
    (3)VirtualAddress: 该块时装载到内存中的RVA,注意这个地址是按内存页对齐的,她总是SectionAlignment的整数倍,在工具中第一个块默认RVA为1000,在OBJ中为0。
    (4)SizeofRawData: 该块在磁盘中所占的大小,在可执行文件中,该字段包括经过FileAlignment调整后块的长度。例如FileAlignment的大小为200h, 如果VirtualSize中的块长度为19Ah个字节,这一块保存的长度为200h个字节.
    (5) PointerToRawData: 该块是在磁盘文件中的偏移,程序编译或汇编后生成原始数据,这个字段用于给出原始数据块在文件的偏移,如果程序自装载PE或COFF文件(而不是由OS装载),这种情况,必须完全使用线性映像方法装入文件,需要在该块处找到块的数据。
    image037.png
    虽然编译器自动产生一系列标准的区块,我们可以创建和命名自己的区块,在VC++中可以使用:
    #pragma data_seg(“My_DATA”)
    编译器有个很搞笑的特征,看见两个区块相似的属性的区块,那么连接时就合并成一个区块,这个取决于是否用/merge开关 /merge .rdata = .text
    我们只需要ROffset和Rsize,计算一下这两个块的大小
    400+C600=CA00      (16进制下)
    我们把未脱壳的程序放入HexWorkshop,CTRL+G转到CA00处
    image039.png
    image040.png
    l   C9 F6加上 10个字节
    l   CA 04减去 4个字节
    所到达的地方都是CA 00
    就来到我们之前往上找到00末尾的位置
    从A5开始,一直到最后复制下来
    打开脱壳之后修复的文件,拖入HEXWORKSHOP
    image042.png
    在最后末尾处,粘贴刚刚复制的代码
    最后,保存一下,备份点一下,打开程序看一下能否正常运行。OK,数据处理完毕
    最后看一下壳子
    image044.png
    壳子已经脱掉,显示附加数据不用管,之后载入od,看一下oep
    image045.png
    具体原理研究可以去寻找Lenus大神的《浅谈脱壳中的附加数据问题(overlay)》和《PE文件中区段的详细分析 》这两篇文章

    总结:
    1.简单介绍什么是附加数据
    2.overlay又是什么意思
    3.文件映射知识
    4.回顾ESP定律
    5.Winhex、HEXWORKSHOP使用方法
    6.两种方法附加数据的处理
    7.区段表小姿势
    附件我打包了:https://share.weiyun.com/f77b55313d161b64d3e791d1af3e08877天有效期)
    360报毒,请在虚拟机测试

    本帖被以下淘专辑推荐:

    yyyxy 管理员 六国战旗移动展示平台! 秦 楚 燕 魏 齐 赵
    来自 12#
    发表于 2017-5-19 14:09:17

    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!
    奖金
    点评
    100
    不错,逻辑清晰,思路完善,下次努力

    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!投稿请加我QQ:286894635。
    i春秋-楚:533191896
    i春秋-燕:129821314
    i春秋-齐:417360103
    i春秋-秦:262108018
    使用道具 举报 回复
    发表于 2017-5-10 14:29:16
    PE格式中保存了文件的大小,没记错的话文实际大小大于这个数的话都被视为overlay
    使用道具 举报 回复
    Krillin 发表于 2017-5-10 14:29
    PE格式中保存了文件的大小,没记错的话文实际大小大于这个数的话都被视为overlay ...

    使用道具 举报 回复
    发表于 2017-5-11 10:19:33
    因缺思厅
    http://www.dbgpro.com
    使用道具 举报 回复
    发表于 2017-5-11 22:17:05
    感谢分享经验
    使用道具 举报 回复
    谢谢分享111
    使用道具 举报 回复
    发表于 2017-5-13 00:30:33
    dsvfvfxsaxsaxc
    使用道具 举报 回复
    发表于 2017-5-13 01:16:53
    感谢分享, 学习了
    使用道具 举报 回复
    发表于 2017-5-13 02:00:16
    厉害,谢谢分享
    使用道具 举报 回复
    发表于 2017-5-14 00:07:46
    6666666666666666666666
    使用道具 举报 回复
    发表于 2017-5-16 22:58:17
    学习了哈。。。
    使用道具 举报 回复
    发表于 2017-5-24 17:10:31
    非常好。
    使用道具 举报 回复
    发表于 2017-5-25 20:59:25

    感谢老铁
    使用道具 举报 回复
    发表于 2017-8-1 09:17:16
    感谢分享
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册