linux很少有需要crack的软件,所以最近总是自娱自乐。自己写的软件自己破着玩但是由于都是知道自己的手段,没有什么意思。真的希望有高手们写些crackme for linux 。
最近看了看windows的脱壳大致的理解了脱壳的原理,之前没有怎么接触脱壳,通常只是选择没有壳的软件看看。在linux下的壳没有找到几个。只找到了一个upx的壳,在windows下是个弱壳。实际上在linux下面也是弱壳,完全可以使用"upx -d"的命令解决问题。但我总是喜欢自己手动的。呵呵....纯属于自娱自乐。
ok,开始我们的linux的upx的脱壳之旅.........
我在选择工具的时候花了很多时间,忽然发现GDB在upx面前是那么的苍白无力...也终于知道为什么有人说GDB不适合做逆向了...虽然软件在调试器里可以正常于运行,正常下断。但是根本无法查看反汇编的代码.......。
无奈无奈....使用传说中最好的工具 IDA 为此我特地简单的学习了一下IDC脚本的使用方法...
没有什么资料可以参考,是一件很不愉快的事情,因为不知道能不能成功。不管了,一步一步来吧...
我用“upx -d“ 脱出了原来的文件,发现文件是全的,没有任何部分丢失,所以我相信这些文件会出现在进程空间的某个时间的某个角落,这个很大的坚定了我手动脱壳的信心(但是实际上到这篇文章的结尾我也没有能够在找到完整的程序文件,但我相信理论上内存空间中应该会出现完整的文件的...)。
我的加壳软件是我上次文章中用到做外挂的mines(扫雷游戏)。先找到了upx-3.03-i386_linux 软件 附件中我会给出的免的度这篇文章的人去寻找了。
对我们目标软件加壳,命令如下,的确是个好用的压缩壳软件,直接有54%的压缩律。
代码:
[jun@beijihuCom dumpupx]$ ./upx mines
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2008
UPX 3.03        Markus Oberhumer, Laszlo Molnar & John Reiser   Apr 27th 2008
        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
     13960 ->      7556   54.13%  linux/elf386   mines                        
Packed 1 file.
[jun@beijihuCom dumpupx]$
好了,我们开始调试他了,加了壳以后,一般的调试软件已经对他无能为力了...
实验一下GDB 和 DDD 的效果...以及objdump
readelf还可以正常使用,(仅限于一部分功能.呵呵,不详谈了...)
代码:
[jun@beijihuCom dumpupx]$ readelf -e ./mines
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - Linux
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0xc02598
  Start of program headers:          52 (bytes into file)
  Start of section headers:          0 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         2
  Size of section headers:           40 (bytes)
  Number of section headers:         0
  Section header string table index: 0
There are no sections in this file.
Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x00c01000 0x00c01000 0x01d60 0x01d60 R E 0x1000
  LOAD           0x0002fc 0x0804b2fc 0x0804b2fc 0x00000 0x00000 RW  0x1000
上面的输出,我们可以发现他的入口点是0xc02598 这个入口点已经和GCC编译出来的程序大不一样了。实际上重“upx -d“脱出来的效果来看,原来的入口点基本上是不会改变的,也就是说我们的手动脱壳的时候软件的入口点,加载方式都是和未加壳的软件是一样的...这一点又为我们的脱壳成功,增加了砝码..
继续....gdb 调试一下
代码:
(gdb) b *0xc02598
Breakpoint 1 at 0xc02598
(gdb) r
Starting program: /home/jun/Crack/dumpupx/mines
warning: shared library handler failed to enable breakpoint
(no debugging symbols found)
Breakpoint 1, 0x00c02598 in ?? ()
(gdb) disassemble
No function contains program counter for selected frame.
(gdb)
gdb看不反汇编代码,晕了都不知道下一步的操作是什么....看来是没有什么用了
祭起传说中的逆向利器IDA.学西习了一下,简单操作,我开始了调试之旅.
代码:
[jun@beijihuCom dumpupx]$ idal ./mines
等到加载完成,会停在入口处,呵呵在光标在call上直接按F4,程序运行,停到了入口出
单步运行...实际上我没有什么办法,不知道有什么下好的方法下断点,可以使这个简单方法调试...
这边我是这么想的,upx是压缩壳,当他把执行权交给原目标程序的时候,必定会有一个大的跳转,好多新手在windows脱壳,都是以这个为oep的标准的。linux应该也不会例外的...
F8单步到0xc025c8 跳到 oxc025d1 在 0xc025d3 又会跳回来。显然是个循环。不在循环里浪费时间了。我们向下找找,下面有个retn返回。光标移到上面F4。实际上没有什么把握。只是蒙的,结果很好,没有飞走.F8单步到了这里
继续单步,retn到一个地方
不详细分析了往下看。翻阿翻,不会这么巧吧.看见了 jmp dword ptr [edi]跳转,这不会是传说中的大跳吧。
不管直接F4到这里...哈哈很成功。
单步一下,跳到了这里。
不懂代码的具体含义,但是明显不是程序的入口...为什么?单步....继续
看到这里我忽然顿悟,这里是在做ld连接,不能让他运行了,很可能是为了我们目标程序的运行进行共享库的连接..会修改我们内存中的映像文件。这样我们dump出来的就不是原来的干净程序,因为我们没有修复工具,比起windows里面的PE修复要麻烦多了.....所以赶紧dump出来...
用来dump映像的idc脚本
代码:
#include <idc.idc>
#define PT_LOAD              1
#define PT_DYNAMIC           2
static main(void)
{
  auto ImageBase,StartImg,EndImg;//基址 08048000
  auto e_phoff;
  auto e_phnum,p_offset;//paddr 0xc 地址,pmemsz ox14大小,p_offset 0x4
  auto i,dumpfile;
    ImageBase=0x08048000;
  StartImg=0x08048000;
  EndImg=0x0; 
  Message("%8x\n",Dword(ImageBase));
  if (Dword(ImageBase)==0x7f454c46 || Dword(ImageBase)==0x464c457f )
  {
    if(dumpfile=fopen("./dumpfile","w+"))
    {
      e_phoff=ImageBase+Word(ImageBase+0x1c);
      e_phnum=Word(ImageBase+0x2c);
      for(i=0;i<e_phnum;i++)
      {
         if (Dword(e_phoff)==PT_LOAD || Dword(e_phoff)==PT_DYNAMIC)
         
          {  p_offset=Dword(e_phoff+0x4);       
            StartImg=Dword(e_phoff+0xc);
            EndImg=Dword(e_phoff+0xc)+Dword(e_phoff+0x14);
             
                dump(dumpfile,StartImg,EndImg,p_offset);
                Message("dump LOAD%d ok.\n",i);
          }   
         
        e_phoff=e_phoff+0x20;
      }
      fseek(dumpfile,0x30,0);
      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);
    }
}
改变文件的属性,让他可以运行。
代码:
[jun@beijihuCom dumpupx]$ su
口令:
[root@beijihuCom dumpupx]# chmod 755 ./dumpfile
[root@beijihuCom dumpupx]# ./dumpfile
程序运行的很好..
总结:第一次在linux下手动脱壳,看上去文章中写的很轻松,实际上在之前做了很多工作。包括ELF的加载等等。还有我发现如果程序的节表头程序也能很好的运行,什么的..
另外,我之调试的时候,实际经过很多挫折...没有足够的经验嘛...不过些文章,截图的时候都很顺利..呵呵.共勉........

转载于:https://blog.51cto.com/yueyuanyuan/352885

linux 下 upx 脱壳笔记相关推荐

  1. linux下SVN配置笔记(转)

    linux下SVN配置笔记  李群林 转载了 皋军 的博文  [查看原文][转载时间:2012-09-20 10:40] 关键字: linux下svn配置笔记  一.安装SVN默认安装到/usr/lo ...

  2. Linux下安装JDK笔记与Linux安装Tomcat笔记

    项目需要,又要折腾Linux了,使用了VMware装一下linux,配置java运行环境,首先是配置JDK... OS:CentOS 64bit 一:到Oracle下载最新版的JDK http://w ...

  3. Linux下为知笔记和蚂蚁笔记测评,推荐蚂蚁笔记!(非广告)

    本人由于学习Linux,需要一款可以在Linux平台下可以运行的一款软件,了解到为知笔记之笔记(下文以W代替)和蚂蚁笔记(下文以M代替)比较出名,由于某云和某象笔记在linux平台下没有对应的软件,所 ...

  4. Linux下QT安装笔记

    QT安装笔记 1.操作系统:Centos7 2.下载Qt: 官网:https://download.qt.io/archive/qt/5.9/5.9.5/qt-opensource-linux-x64 ...

  5. linux下i2c驱动笔记

    1. 几个基本概念 1.1. 设备模型 由 总线(bus_type) + 设备(device) + 驱动(device_driver) 组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连 ...

  6. linux 下camera调试笔记【转】

    转自:https://blog.csdn.net/kevinx_xu/article/details/8801931 linux camera调试 2011-10-23 10:43:37|  分类:  ...

  7. Linux下汇编语言学习笔记12 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  8. Linux下汇编语言学习笔记65 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  9. Linux下汇编语言学习笔记13 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

最新文章

  1. ArcGIS Server for Silverlight 之集群(Simple Clusterer)
  2. codefirst 兼容oracle,EF6+MVC5之Oracleo数据库的CodeFirst方式实现
  3. Oracle SQL Loader数据导入
  4. 暴风集团冯鑫被批捕:涉嫌对非国家工作人员行贿罪、职务侵占罪
  5. 大数据之-Hadoop3.x_Yarn_公平调度器---大数据之hadoop3.x工作笔记0146
  6. Linux驱动编程--基于I2C子系统的I2C驱动
  7. XILINX FPGA数字信号处理——2、数字信号处理实现方法
  8. c51单片机编程实例c语言,C51单片机C语言编程基础和实例
  9. 计算机视觉的一些测试数据集和源码站点
  10. php 电梯程序设计,plc在电梯自动控制中的应用编程实例
  11. liunx命令大全建议粘贴到word文档可方便查询
  12. 实现工地实名制门禁管理的人脸识别系统
  13. 嵌入式开发日记(3)——利用Python接收并处理JY61传感器数据
  14. java sof栈泄露_java虚拟机(四)--内存溢出、内存泄漏、SOF
  15. ibm aix_IBM AIX设备驱动程序开发
  16. 4804: 欧拉心算
  17. oracle中取月初,月末,季初,季末及年初,年末时间
  18. 三个可替代“迅雷”的下载软件,速度超快!
  19. 安装与使用IPy模块
  20. 应收应付重分类的配置和操作详解

热门文章

  1. 【通知】深度学习之模型设计书籍勘误汇总!附赠资源和代码开源问题
  2. 【调参实战】那些优化方法的性能究竟如何,各自的参数应该如何选择?
  3. 中国网络出版产业盈利模式与投资前景形势研究报告2022版
  4. mysql+index组合索引_MySQL 优化之 index merge(索引合并)
  5. 中科微研课题上犹授牌-农业大健康·李喜贵:谋定功能性农业
  6. “AI+”农业向农民致敬-丰收节交易会:谋定工业反哺农业
  7. python学习(1)
  8. #035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)
  9. [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
  10. JFoenix: JavaFX与Google Material Design