0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用NOP指令覆盖相关代码绕开鉴权

Linux阅码场 来源:写个解 作者:吴解君 2021-09-24 10:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

”, money, vip); if (vip == 1) { printf(“授权成功

”); } else { printf(“未授权

”); }}

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权限。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 软件
    +关注

    关注

    69

    文章

    5297

    浏览量

    90863
  • 指令
    +关注

    关注

    1

    文章

    617

    浏览量

    37297

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

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NVMe高速传输之摆脱XDMA设计52:主要功能测试结果与分析4(NVMe 指令提交与完成机制测试)

    。 写完成队列的波形如图 1 所示。 NVMe 设备通过 axis_cq 接口发起了一次写TLP 请求, 写地址对应了 Admin CQ 地址, 写数据内容显示指令正常完成。 然后 NoP逻辑加速引擎通过
    发表于 12-04 11:47

    单片机可靠性差的解决办法

    使用ERROM空间的填充 在程序存储器中未使用的EPROM空间,首先填入窄操作指令NOP(无操作指令)。 在NOP指令后,填入一条跳转
    发表于 11-25 06:10

    对浮点指令扩展中部分问题的解决与分享

    经过数周的前期准备与研读代码,我们组终于正式开始对浮点指令进行扩展并不出意外地遇到了一些小问题,本篇文章针对这些问题作出解决方法的分享。 一. 在e203_exu_decode中,发现变量
    发表于 10-24 08:14

    浮点数的指令添加——最终写回仲裁

    有优先进行写回后,代码中将相应的写回数据、寄存器编号和有效性等信号发送到最终写回到寄存器文件的接口。同时,它还处理错误和不可写回的情况。具体来说,如果指令存在错误或不可写回,它将被在执行单元级别
    发表于 10-24 06:29

    浮点数指令添加——最终写回仲裁

    有优先进行写回后,代码中将相应的写回数据、寄存器编号和有效性等信号发送到最终写回到寄存器文件的接口。同时,它还处理错误和不可写回的情况。具体来说,如果指令存在错误或不可写回,它将被在执行单元级别
    发表于 10-24 06:21

    Whetstone代码涉及的浮点指令汇编分析

    对benchmark中的whetstone进行代码分析,通过反汇编统计所出现的浮点指令,共有26种,如下 特点是只涉及单精度的浮点指令,并且存在有浮点Load/Store的压缩指令
    发表于 10-22 08:11

    RISC-V V扩展的指令代码

    执行指令,可以更加灵活地进行程序控制,提高了程序的可编程性和可扩展性。 2.指令代码格式 VADD 指令 vadd.vv v1, v2, v3 这条
    发表于 10-21 13:11

    浮点指令扩展中16位指令的处理

    指令取代对应的宽指令由它们决定。 为了能在一系列的程序上得到良好的代码压缩效果, RISC-V 架构师精心挑选了 RVC扩展中的指令。同时,基于以下的三点观察,架构师们成功地将
    发表于 10-20 11:02

    全球商用验证!这款防伪芯片守护数千万消费电子设备电池安全

    美元,预计未来几年还将继续增长,其中一个重要方向便是消费电子领域。 行业痛点倒逼技术革新:防伪芯片成守护电池安全刚需 消费电子领域的 “假冒乱象” 早已不只是简单的品牌侵权问题。例如,未经认证的第三方手机电池因质量问题可
    的头像 发表于 10-17 09:07 5035次阅读
    全球商用验证!这款防伪<b class='flag-5'>鉴</b><b class='flag-5'>权</b>芯片守护数千万消费电子设备电池安全

    NOP912/NOP914运算放大器用于精密电路和高速应用

    NOP912/NOP914 运算放大器,用于精密电路和高速应用 我们都知道运算放大器(OP Amps)具有多种功能,包括加法、减法、积分、微分和比较,以及小信号的信号和差分放大。这些功能是模拟信号
    发表于 09-05 08:15

    详解Linux权限相关指令

    Linux严格来说是一个操作系统,我们称之为“核心”(kernel)。而作为用户的我们并不能直接与核心交流,这时候就有一个中间人的角色出现:将我们的指令翻译为核心可以看懂的符号,交由核心执行,并将执行结果翻译并返回给我们。
    的头像 发表于 06-06 11:47 801次阅读
    详解Linux权限<b class='flag-5'>相关</b><b class='flag-5'>指令</b>

    何用 C# 代码对 FX3/CX3 的 EEPROM 进行编程?

    /CyUSB-NET-manual/td-p/105011),我如何用 C# 代码对 FX3/CX3 的 EEPROM 进行编程? 我应该使用这个功能吗? \"4.9.1
    发表于 05-26 07:21

    CPU的各种指令和执行流程

    在集成电路设计中,CPU的指令是指计算机中央处理单元(CPU)用来执行计算任务的基本操作指令集。这些指令是CPU能够理解并执行的二进制代码,它们在计算机内部由硬件控制并按顺序执行,从而
    的头像 发表于 04-18 11:24 1910次阅读

    STM32CubeMX生成代码就会覆盖CMakeLists.txt文件,怎么解决?

    请教一下用STM32CubeMX生成代码后,我自己加了一个头文件和源文件,这些自己加的文件不是要配置到CMakeLists.txt编译么,但下载在用STM32CubeMX生成成代码,就会覆盖CMakeLists.txt文件,这种
    发表于 03-12 08:03

    相器和电荷泵的结构设计及优化

    相器+电荷泵(PFD+CP)是锁相环内部的重要结构,在通信系统、频率合成以及时钟信号生成中有着广泛的应用。相器用于检测两个输入信号的相位差,电荷泵把相器输出的相位差转换成电荷输送给滤波器,用于给后续的震荡器提供控制电压。本
    的头像 发表于 01-02 09:39 3566次阅读
    <b class='flag-5'>鉴</b>相器和电荷泵的结构设计及优化