专栏首页LINUX阅码场黑客最简单的软件破解方法,反汇编nop指令覆盖

黑客最简单的软件破解方法,反汇编nop指令覆盖

1. 背景

群里有个小伙伴学习设计加密方法,如同某商用软件输入注册码后就能使用扩展功能。设计时他很自然的想着所写的加密措施是否足够健壮安全,是否有什么方法可以绕过加密检查,也就是破解。

权限管理仅在启动后检查一次注册码是否有效——一个 if 判断,他也认定,若反汇编软件只要 欺骗过这条判断加密措施荡然无存。

群里我给他一个破解设计思想:“利用NOP指令覆盖相关代码绕开鉴权”

2. 演示

下面是我做的一个例子演示运用NOP指令破解:软件a.out在破解前不是vip,直接修改二进制文件后拥有了vip权限

它是怎么实现的呢?先看看源码,源码逻辑很简单,仅仅判断用户有没有money,没有钱当然没权限。

为了便于阐述原理,我编译源码带上调试选项:-g,生成的可执行文件a.out反汇编后就能同时看到源码和汇编内容。

void main()
{
    int money = 0;
    int vip = 1;

    asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
    asm("nop");  // 无效指令
    if (money == 0) {
        vip = 0;
    }

    printf("money %d vip %d\r\n", money, vip);
    if (vip == 1) {
        printf("授权成功\r\n");
    }
    else {
        printf("未授权\r\n");
    }
}

a.dis 是反汇编文件,138行是vip=0的汇编代码 “movl $0x0,-0x4(%rbp)”, 对应机器码为 “c7 45 fc 00 00 00 00” , 左侧窗口内容是a.out二进制文件,文件第1168字节位置找到相应机器码。

3. 开始破解

接下来这么修改呢?轮到主角nop指令登场。

据我所知,每种处理器都会有一条瞎忙活空指令nop(No Operation)。CPU遇到nop指令仅空转,浪费你的电费,不干实际有意义的事情(其实空转也是为了更有意义的发挥效能,上班摸鱼是不是能更有活力!

), 那么想办法把“vip=0”这条语句生成7字节机器码 “c7 45 fc 00 00 00 00”,替换成nop指令的机器码,是不是就破解了呢?如果nop机器码是2字节,我的还需考虑指令完整性对齐,覆盖机器码长度必须是nop机器码整数倍。

问题来了:x86的nop指令对应的机器码是什么呢?习惯性百度搜索 “x86 nop 机器码”。我这里介绍更简洁直接的方法,需要查询什么反汇编指令,问问反汇编工具objdump。

有没有注意到源码里我写了若干行指令 ‘asm(“nop”)’,c语言可以嵌入汇编,查看反汇编文件a.dis告诉我nop指令最终编译得到的机器码是什么。

反汇编后nop的机器码是 0x90。谢天谢地,芯片工程师设计指令操作码时只给它一个字符。任何正整数都是1的整数倍,不用考虑指令完整性对齐。

顺带留给读者一个思考题:对于x86这种 CISC 复杂指令集,把nop指令的机器码设计成只有一个字节,有什么好处?

替换后的源码 “vip = 0” 这行如同被注释掉一样。

保存修改,再次执行,看到了吗!已经得到了VIP权限。

本文分享自微信公众号 - Linux阅码场(LinuxDev)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Bufbomb缓冲区溢出攻击实验详解-CSAPP

    zhwhong
  • 《深入理解计算机系统》(CSAPP)实验三 —— Buf Lab

      本实验的目的在于加深对IA-32函数调用规则和栈结构的具体理解。实验的主要内容是对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击(buffer o...

    嵌入式与Linux那些事
  • 反汇编算法介绍和应用——线性扫描算法分析

            做过逆向的朋友应该会很熟悉IDA和Windbg这类的软件。IDA的强项在于静态反汇编,Windbg的强项在于动态调试。往往将这两款软件结合使用会...

    方亮
  • 腾讯极客挑战赛丨从“碰撞”到“爆破”,42次尝试终破纪录

    各位爱挑战爱学习的coder们,大家千呼万唤的解题思路来啦!(原赛题传送门:腾讯极客挑战赛丨全世界最最最小的程序,等你来battle!)

    腾讯极客挑战赛
  • 面试官不讲武德,居然让我讲讲蠕虫和金丝雀!

      蠕虫是一种可以自我复制的代码,并且通过网络传播,通常无需人为干预就能传播。蠕虫病毒入侵并完全控制一台计算机之后,就会把这台机器作为宿主,进而扫描并感染其他计...

    嵌入式与Linux那些事
  • 二进制程序分析指南

    分析恶意软件的第一步是收集二进制程序在主机上执行的行为事件,研究人员根据这些行为大体形成一个思路来描述恶意软件的功能。

    FB客服
  • [系统安全] 五.OllyDbg和Cheat Engine工具逆向分析植物大战僵尸游戏

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏...

    Eastmount
  • 【嵌入式秘术】手把手教你如何劫持RTOS(下)

    在《【嵌入式秘术】手把手教你如何劫持RTOS(上)》中,我们做了简单的热身——介绍了一种在你拥有某一个库的源代码或者.lib文件时,如何劫持“针对库中已有函数调...

    GorgonMeducer 傻孩子
  • 【技术创作101训练营】CTF-PWN方向入门

    PWN 是一个黑客语法的俚语词,是指攻破设备或者系统。发音类似"砰"。对黑客而言,这就是成功实施黑客攻击的声音”砰”的一声,被"黑"的电脑或手机就被你操纵了。

    yichen
  • 《深入理解计算机系统》(CSAPP)实验四 —— Attack Lab

      在官网下载得到实验所需文件解压后会得到五个不同的文件。对六个文件简要说明如下所示。

    嵌入式与Linux那些事
  • 【编译器玄学研究报告】第三期——“-O0” 就能逃出优化的魔爪么?

    很多人对编译器优化等级0("-O0")有着谜之信仰——认为在这个优化等级下编译器一定不会对代码进行不必要的优化——至少不会进行危险且激进的优化。让我们来看一个来...

    GorgonMeducer 傻孩子
  • Gacrux:基于C语言的可自定义PE加载恶意软件

    近期,我对这款名为Gacrux的恶意软件样本进行了分析。考虑到这两个样本文件的来源,我无法直接跟大家共享文件的哈希或直接公开样本文件,不过根据本文所提供的信息,...

    FB客服
  • 16位汇编第九讲汇编指令以及逆向中的花指令

                                          16位汇编第九讲汇编指令以及逆向中的花指令 一丶LOOP指令(循环指令) 作用:  ...

    IBinary
  • 在不影响程序使用的情况下添加shellcode

    在文章Backdooring PE Files with Shellcode中介绍了一种在正常程序中注入shellcode的方式,让程序以前的逻辑照常能够正常运...

    CN_Simo
  • SWIFT惊天银行大劫案全程分析

    1.前言 最近,使用国际银行业合作SWIFT系统的银行频频发生被盗,是由于SWIFT系统真的存在严重安全问题,还是跟好莱坞大片那样直接撬开银行金库?本文将针对孟...

    FB客服
  • 0Day技术分析-3-shellcode初探

    Shellcode初探 1 相关概念 这一章,我们介绍shellcode的相关概念,并对shellcode进行初步的探索,为我们后面的高级课程打下相关基础。 1...

    zhisheng
  • 反作弊如何检测系统仿真(1)

    作为我们的第一篇文章介绍了检测VMM是否存在的各种方法,无论是商业的还是定制的,我们都希望做到透彻并将其与我们对流行的反作弊厂商的研究联系起来。首先,对于游戏黑...

    franket
  • 栈上内存溢出漏洞利用之Return Address

    程序员大多都碰到过栈上内存溢出,最常见的结果是导致程序Crash,有时候也有可能因为覆盖栈上的信息导致程序执行一些意想不到的逻辑,这种情况往往比起Crash更加...

    河边一枝柳
  • 测试面试题集锦(一)| 软件测试常见必考问题与流程篇(附答案)

    本系列文章总结归纳了一些软件测试工程师常见的面试题,主要来源于个人面试遇到的、网络搜集(完善)、工作日常讨论等,分为以下十个部分,供大家参考。如有错误的地方,欢...

    霍格沃兹测试开发

扫码关注云+社区

领取腾讯云代金券