实验四:使用UPX加壳与脱壳

实验四:使用UPX加壳与脱壳实验四:使用UPX加壳与脱壳报告人姓名:苏煜程学号:031803108一、实验目的了解程序加壳、脱壳原理掌握PE文件结构学习利用UPXShell、LoardPE、IDA等工具完成软件的加、脱壳操作二、实验题目UPX加壳:对crackme加上UPX壳,用LordPE或PEiD工具查看加壳前后的变化UPX脱壳:用UPXUnpacker对已加壳的crackme.exe程序进行脱壳手动脱壳:使用ESP定律和Ollydbg工具对crackme.exe进行手工脱壳IDA静

一、实验目的

  • 了解程序加壳、脱壳原理
  • 掌握PE文件结构
  • 学习利用UPX Shell、LoardPE、IDA等工具完成软件的加、脱壳操作

二、实验题目

  • UPX加壳:对crackme加上UPX壳,用 LordPE 或 PEiD 工具查看加壳前后的变化
  • UPX脱壳:用UPX Unpacker对已加壳的 crackme.exe 程序进行脱壳
  • 手动脱壳:使用ESP定律和Ollydbg工具对crackme.exe进行手工脱壳
  • IDA静态分析:用 IDA 的 F5 反汇编功能查看脱壳前后的程序伪代码,获取运行crackme后屏幕提示的输入口令

三、实验环境

  • Windows 7系统或以上、连接Internet的主机
  • 可能会用到的软件:upxshell、LordPE、PEiD、upx unpacker、IDA、OllyDBG
  • 手动脱壳实例参考:https://www.52pojie.cn/thread-727090-1-1.html
  • ESP定律学习参考:https://www.52pojie.cn/thread-394116-1-1.html

四、实验步骤及结果

4.1 UPX加壳

首先查看未加壳前的应用程序
在这里插入图片描述

现在使用UPX Shell对壳进行加载
在这里插入图片描述

检查发现已经加壳成功
在这里插入图片描述

4.2 UPX脱壳

用UPX Unpacker对已加壳的 crackme.exe 程序进行脱壳
在这里插入图片描述

在这里插入图片描述

4.3 手动脱壳

根据ESP定律先找到PUSHAD下使得ESP变红的内存地址
在这里插入图片描述

然后在数据窗口中追踪
在这里插入图片描述

然后使用断点 –> 硬件访问 –> Word
在这里插入图片描述

然后使用F9直接运行到
在这里插入图片描述

然后再F8运行到OEP
在这里插入图片描述

然后删除硬件断点
在这里插入图片描述

然后使用Ollydbg脱壳工具进行脱壳
在这里插入图片描述

在这里插入图片描述

可以发现dump出来的文件脱壳成功
在这里插入图片描述

4.4 IDA静态分析

使用IDA打开脱壳后的文件可以看到main函数源代码
在这里插入图片描述

// write access to const memory has been detected, the output may be wrong!
int main_0()
{ 
   
  int v0; // ST14_4
  int v1; // edx
  int result; // eax
  int v3; // ST14_4
  int v4; // edx
  unsigned int i; // [esp+50h] [ebp-2Ch]
  char v6; // [esp+54h] [ebp-28h]
  char v7; // [esp+55h] [ebp-27h]
  char v8; // [esp+56h] [ebp-26h]
  char v9; // [esp+57h] [ebp-25h]
  char v10; // [esp+58h] [ebp-24h]
  char v11; // [esp+59h] [ebp-23h]
  char v12; // [esp+5Ah] [ebp-22h]
  char v13; // [esp+5Bh] [ebp-21h]
  char v14; // [esp+5Ch] [ebp-20h]
  char v15; // [esp+5Dh] [ebp-1Fh]
  char v16; // [esp+5Eh] [ebp-1Eh]
  char v17; // [esp+5Fh] [ebp-1Dh]
  int v18; // [esp+60h] [ebp-1Ch]
  int v19; // [esp+64h] [ebp-18h]
  char v20[20]; // [esp+68h] [ebp-14h]

  v6 = 'r';
  v7 = 'o';
  v8 = 'i';
  v9 = 's';
  v10 = '2';
  v11 = '0';
  v12 = '1';
  v13 = '4';
  v14 = 'r';
  v15 = 'o';
  v16 = 'i';
  v17 = 's';
  v18 = '\0';
  v19 = '\0';
  printf("password:");
  scanf("%s", v20);
  if ( strlen(v20) == 12 )
  { 
   
    for ( i = 0; i < 0xC && *(&v6 + i) == v20[i]; ++i )
      ;
    if ( i == 12 )
      printf("good job!\nthe key is your input!\n");
    else
      printf("try again!\n");
    if ( --stru_437180._cnt < 0 )
    { 
   
      _filbuf(&stru_437180);
    }
    else
    { 
   
      v3 = (unsigned __int8)*stru_437180._ptr;
      ++stru_437180._ptr;
    }
    if ( --stru_437180._cnt < 0 )
    { 
   
      _filbuf(&stru_437180);
    }
    else
    { 
   
      v4 = (unsigned __int8)*stru_437180._ptr;
      ++stru_437180._ptr;
    }
    result = 0;
  }
  else
  { 
   
    printf("try again!!\n");
    if ( --stru_437180._cnt < 0 )
    { 
   
      _filbuf(&stru_437180);
    }
    else
    { 
   
      v0 = (unsigned __int8)*stru_437180._ptr;
      ++stru_437180._ptr;
    }
    if ( --stru_437180._cnt < 0 )
    { 
   
      _filbuf(&stru_437180);
    }
    else
    { 
   
      v1 = (unsigned __int8)*stru_437180._ptr;
      ++stru_437180._ptr;
    }
    result = 0;
  }
  return result;
}

程序是在与字符串rois2014rois进行比较,所以密码就是rois2014rois,测试成功
在这里插入图片描述

今天的文章实验四:使用UPX加壳与脱壳分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/33679.html

(0)
编程小号编程小号

相关推荐

发表回复

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