elf 变异upx 脱壳

elf 变异upx 脱壳题目是某ctf题首先使用IDA打开:函数极少,有壳。查看函数这个跳转比较可疑下面进行IDA动态调试进入loc_52D516再进入直到找到jmpr13运行到这里,F8跳转直接retn下断点F9,直接retn下断点F9重复,直到遇到一个大跳转单步,然后return来到了程序入口下面dump脱壳(转储的意思)。dump要使用脚本,因为我是个菜鸡,直接在网上找的脚本,通用的。idc脚本下载可以存放在ida里面有个脚本的文件夹idc,源码后面会附上首先在D盘下

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

题目
是某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就是脱壳后的文件了。

源码:

#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.net/158110.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java try catch 吃掉异常与跑出异常的区别,以及在项目中是否改抛出异常的理解

    java try catch 吃掉异常与跑出异常的区别,以及在项目中是否改抛出异常的理解

    2021年7月19日
    79
  • 数据库多表联合查询附简单例子

    数据库多表联合查询附简单例子多表联合查询多表联合查询可以通过连接运算实现,而连接运算又可以通过广义笛卡尔积后在进行选择运算来实现。 Select 多表联合查询语句Select 列名 [[,列名]…]from 表名1,表名2,,…Where 查询条件; 可以使用as为表或者字段(属性)取别名; Select 列名 [[,列名]…]from 表名1[as] 别名1,表名2[a…

    2022年6月10日
    357
  • matlab物理碰撞建模_opencascade 碰撞检测

    matlab物理碰撞建模_opencascade 碰撞检测碰撞检测Note本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,…

    2025年7月14日
    4
  • vim不能复制粘贴_在筛选状态下怎么复制粘贴

    vim不能复制粘贴_在筛选状态下怎么复制粘贴前言这是一则记录贴,防止小技巧遗忘。不知道大家是否会有这种困扰,例如在AndroidStudio有一段缩进优美的代码实现,例如:publicvoidsayHello(){Stringmsg=”HelloVimPasteMode”;System.out.println(msg);}当你把这段缩进优美的代码直接ctrl+c,ctrl+v到Vim的时候,就会出现如

    2025年11月22日
    5
  • vue.cli项目封装全局axios,封装请求,封装公共的api和调用请求的全过程[通俗易懂]

    vue.cli项目封装全局axios,封装请求,封装公共的api和调用请求的全过程[通俗易懂]vue项目的前期配置封装axios实例封装API

    2022年6月11日
    29
  • 线性探测再散列

    线性探测再散列哈希表又称散列表。哈希表存储的基本思想是:以数据表中的每个记录的关键字k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。在此称该函数H为哈函数或散列函数。按这种方法建立的表称为哈希表或散列表。处理冲突的方法:开放寻址法:Hi=(H(key)+di)MODm,i=1,2,…,k(k<=…

    2022年5月15日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号