首页
社区
课程
招聘
[原创]ELF64手脱UPX壳实战
发表于: 2019-11-8 20:59 25423

[原创]ELF64手脱UPX壳实战

2019-11-8 20:59
25423

最近在做CTF逆向习题时,遇到一个带有UPX壳的ELF CrackMe,题目的目标是找到flag。
由于此前只对PE做过UPX脱壳,本来使用UPX的脱壳工具,用命令就能脱壳,但是出于研究的目的,看看ELF文件的UPX如何手动脱壳,话不多说,进入正题~

#include <idc.idc>
#define PT_LOAD              1
#define PT_DYNAMIC           2
static main(void)
{
         auto ImageBase,StartImg,EndImg;
         auto e_phoff;
         auto e_phnum,p_offset;
         auto i,dumpfile;
         ImageBase=0x400000;
         StartImg=0x400000;
         EndImg=0x0;
         if (Dword(ImageBase)==0x7f454c46 || Dword(ImageBase)==0x464c457f )
  {
    if(dumpfile=fopen("G:\\dumpfile","wb"))
    {
      e_phoff=ImageBase+Qword(ImageBase+0x20);
      Message("e_phoff = 0x%x\n", e_phoff);
      e_phnum=Word(ImageBase+0x38);
      Message("e_phnum = 0x%x\n", e_phnum);
      for(i=0;i<e_phnum;i++)
      {
         if (Dword(e_phoff)==PT_LOAD || Dword(e_phoff)==PT_DYNAMIC)
                         { 
                                 p_offset=Qword(e_phoff+0x8);
                                 StartImg=Qword(e_phoff+0x10);
                                 EndImg=StartImg+Qword(e_phoff+0x28);
                                 Message("start = 0x%x, end = 0x%x, offset = 0x%x\n", StartImg, EndImg, p_offset);
                                 dump(dumpfile,StartImg,EndImg,p_offset);
                                 Message("dump segment %d ok.\n",i);
                         }    
         e_phoff=e_phoff+0x38;
      }

      fseek(dumpfile,0x3c,0);
      fputc(0x00,dumpfile);
      fputc(0x00,dumpfile);
      fputc(0x00,dumpfile);
      fputc(0x00,dumpfile);

      fseek(dumpfile,0x28,0);
      fputc(0x00,dumpfile);
      fputc(0x00,dumpfile);
      fputc(0x00,dumpfile);
      fputc(0x00,dumpfile);
      fputc(0x00,dumpfile);
      fputc(0x00,dumpfile);
      fputc(0x00,dumpfile);
      fputc(0x00,dumpfile);

      fclose(dumpfile);
        }else Message("dump err.");
 }
}
static dump(dumpfile,startimg,endimg,offset) 
{
        auto i;
        auto size;
        size=endimg-startimg;
        fseek(dumpfile,offset,0);
        for ( i=0; i < size; i=i+1 ) 
        {
        fputc(Byte(startimg+i),dumpfile);
        }
}
  • IDA
  • Ubuntu18.04
  • 首先在Ubuntu上运行程序,观察程序的运行情况

  • Ubuntu上打开终端使用命令查看当前IP
  • 将IDA文件夹内的linux_server64拷贝到Ubuntu系统中,给与运行权限并运行

  • 将ELF文件拖入Win上的IDA内,选择Linux远程调试器,填入Ubuntu的IP地址启动调试,弹框点击确定

  • 开始单步调试,单步调试遵循两个原则:1.除非F8跑飞,否则不用F7。2.循环直接跳过。






    0x3 Dump内存文件

  • 顺利找到OEP,准备dump内存
  • dump文件执行结束,在对应目录生成dump文件

  • 将dump文件拖入Ubuntu系统给与权限,并运行查看结果

    0x4 Dump文件代码

  • 样本来源于CTF的逆向题,各位可放心下载练习,如果有兴趣,可以继续找出目标flag。
  • 链接: https://pan.baidu.com/s/1YzHb9zTPxUcRDcDnr2VZ6Q 提取码: 8ihv
  • 密码:bbs.pediy.com
  • IDA
  • Ubuntu18.04
  • 首先在Ubuntu上运行程序,观察程序的运行情况

  • Ubuntu上打开终端使用命令查看当前IP

  • [培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

    收藏
    免费 3
    支持
    分享
    最新回复 (12)
    雪    币: 2345
    活跃值: (3064)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    2
    出于研究的目的你可以直接上github上看upx源码.
    2019-11-8 21:45
    0
    雪    币: 1790
    活跃值: (378)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    3
    学习了,感谢大牛分享
    2019-11-8 22:46
    0
    雪    币: 292
    活跃值: (153)
    能力值: ( LV3,RANK:30 )
    在线值:
    发帖
    回帖
    粉丝
    4
    很绿。。。下次可以变成红shai箭头。   很细,容易理解。
    2019-11-8 23:07
    0
    雪    币: 545
    活跃值: (376)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    5
    Dstlemoner 很绿。。。下次可以变成红shai箭头。 很细,容易理解。
    太红我怕有些同学接受不了,下次换shai
    2019-11-9 07:50
    0
    雪    币: 14865
    活跃值: (6088)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    6
    upx把脱壳工具分享一下。正好需要。
    你这个不需要修复吗?dump出来就可以运行?
    最后于 2019-11-11 14:26 被tDasm编辑 ,原因:
    2019-11-11 08:20
    0
    雪    币: 26205
    活跃值: (63302)
    能力值: (RANK:135 )
    在线值:
    发帖
    回帖
    粉丝
    7
    感谢分享!mark了
    2019-11-11 15:11
    0
    雪    币: 0
    活跃值: (238)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    8
    早上刚在52上看到,大佬发文都是每个平台发吗?
    2019-11-14 15:29
    0
    雪    币: 545
    活跃值: (376)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    9
    Spwpun 早上刚在52上看到,大佬发文都是每个平台发吗?
    分享给更多人啊
    2019-11-14 18:32
    0
    雪    币: 822
    活跃值: (290)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    11
    这个是不是先dump内存生成一次dumpfile,然后再执行idc脚本啊,不然只看你dump了两个PT_LOAD的segment,没有dump其余部分啊
    2020-12-28 11:41
    0
    雪    币: 822
    活跃值: (290)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    12

    我按照您的步骤操作了一遍,idc生成的文件确实可以用readelf看到完整的elf头,

    但是如图上红色的部分,没看到您的脚本中将这部分写入文件啊?盼回复,多谢

    2020-12-28 15:02
    0
    雪    币: 822
    活跃值: (290)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    13

    更正一下我在第11楼提的问题,可能是我对ELF segment的认识还有问题,参考了一篇文章(ELF文件的加载过程https://blog.csdn.net/gatieme/article/details/51628257其实只是大致看了看elf加载的流程)。ELF加载后内存中只有标识为PT_LOAD或PT_DYNAMIC的segment,所以把这两个segment抓下来就行了。
    不知道这样理解是否有问题,还请楼主看到了再指导一下,多谢

    最后于 2020-12-29 11:17 被lishua编辑 ,原因: 原帖意思表达不透彻
    2020-12-29 11:15
    0
    游客
    登录 | 注册 方可回帖
    返回
    //