前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >elf 变异upx 脱壳

elf 变异upx 脱壳

作者头像
全栈程序员站长
发布2022-09-14 15:33:43
1.4K0
发布2022-09-14 15:33:43
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

题目 是某ctf题

首先使用IDA打开:

在这里插入图片描述
在这里插入图片描述

函数极少,有壳。 查看函数

使用
使用

这个跳转比较可疑

在这里插入图片描述
在这里插入图片描述

下面进行IDA动态调试 进入loc_52D516

在这里插入图片描述
在这里插入图片描述

再进入 直到找到jmp r13 运行到这里,F8跳转 直接retn下断点F9,直接retn下断点F9重复,

在这里插入图片描述
在这里插入图片描述

直到遇到一个大跳转

在这里插入图片描述
在这里插入图片描述

单步,然后return

在这里插入图片描述
在这里插入图片描述

来到了程序入口

请添加图片描述
请添加图片描述

下面dump脱壳(转储的意思)。 dump要使用脚本,因为我是个菜鸡,直接在网上找的脚本,通用的。

idc脚本下载

可以存放在ida里面有个脚本的文件夹idc,源码后面会附上

首先 在D盘下创建一个dumpfile无后缀文件,不然要提示错误

在这里插入图片描述
在这里插入图片描述

当然也可以改文件目录和地址,见源文件 运行到程序入口点。 使用alt+F7载入脚本,选择dump_elf64 等待 加载

请添加图片描述
请添加图片描述

成功以后,刚刚创建的dumpfile就是脱壳后的文件了。

源码:

代码语言:javascript
复制
#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("D:\\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);
        }
}

这个题脱壳后就全是地址了,用了很多方法,没找着主函数,我太菜了

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158110.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年7月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档