毁掉自己的汇编程序

  下午的上机课,有位同学写的程序死了。她百思不得其解。

  我看了几遍程序,没有发现问题。

  多次观察后,发现程序修改数据时,由于循环次数错误地设多了,以致于改到了代码段——代码段的指令于是被当作数据改掉了,而此处的数据,当然它仍然还要被当作指令执行,恰好对应了wait指令!于是,程序进入了等待……

  那程序到底有没有问题?我看的程序没有问题,但运行的,却是老版本的.exe。开始时,源程序是错误的,她修改后,却没有再编译、接连!唉,这样的错也能犯?难为我当教师的了。麻子不叫麻子,叫什么来着?

  按下这个不表,想给大家展示能毁掉自己的奇葩代码。为简单化,我不再用她当时调试的程序,而是设计一个能说明问题的错误程序,把事情说清楚,大家也见识一下就行了。

  我要编的程序,其任务是:将数据区中的所有数据,变为其2倍并存储在原处。阅读下面的有逻辑错误的程序:

assume cs:codesg,ds:datasg
datasg segment
    dw 1,2,3,4,5,6,7,8
datasg ends

codesg segment
start: mov ax, datasg
       mov ds, ax
       mov si, 0
       mov cx, 16  ;这儿应该是8,修改8个字,但错误地写成16了
    s: mov ax, [si]
       add ax, ax
       mov [si], ax
       add si, 2
       loop s

       mov ax,4c00h
       int 21h
codesg ends
end start

  把连接好的程序用debug装入内存观察:

(图1)

  可见,数据从物理地址076A0H处开始,一共同8个字,由1到8;从076B0处始,是代码!图1中,用d命令看到的076B0处的值与用u命令看到的,是一样的值,只不过,前者被当作数据,后者被当作指令。内存中的数据就是那样的,到底是数据还是指令,取决于我们要将它当作什么。

  下面我们执行程序。

  我先揭晓了迷底,这个程序就是循环次数设错了。前8次的循环,完成的是任务中要求的事情,后8次循环,彻底的捣乱。

  用g命令和t命令交替,让循环执行8次:

(图2)

  执行8次后,是这样的:

(图3)

  注意:由(DS)=076AH, (SI)=0010H,(CS)=076BH,当再执行mov [si], ax指令时,修改的就是代码了!程序在毁掉自己!

  我们将循环再执行3次:

(图4)

  再用d命令和u命令观察:

(图5)

  快对照图2!看到了吗?076B0H处的mov ax, 076A呢?076B3H处的mov ds, ax呢?现在的代码已经被改的面目全非!

  再用t和g执行两次:

(图6)

  江山已经破败到如此境地,无法收拾了!

  好了,毁掉自己的汇编程序演示到此。说点什么。

  这种情况,放在高级语言中很难发生。在操作系统尽责的内存管理下,在各种机制约束下,程序安全地存储、运行。

  然而,汇编语言就这么任性!

  这需要我们这些专业人士要对底层熟悉,有足够的敏感不犯这些错误,当然也要有足够的职业道德,不用这种手段去搞破坏。

  当这种问题就要发生,我们还需要用debug之类的底层调试工具,找出bug,使之曝光于天下!

  自豪吧,小猿们!

时间: 2024-12-16 04:15:32

毁掉自己的汇编程序的相关文章

从巴铁看,非法集资毁掉创新后还有办法拯救吗?

近日,一桩引人注目的非法集资案成为媒体头条.北京公安局东城分局发布的消息显示,针对投资人举报北京华赢凯来资产管理有限公司从事非法集资活动的情况,东城分局依法立案侦查,先后将白志明等32名犯罪嫌疑人抓获归案.而这家涉案公司,正是秦皇岛"巴铁1号试验车"项目的出资公司. 原本"巴铁1号"是创新的代表案例,在此前引发诸多轰动.但让人没想到的是,最终却成为非法集资的一个噱头.而从长远来看,非法集资毁掉的不仅仅是"巴铁1号",更是投资者和大众对创新的信心.

x86汇编程序基础(AT&T语法)

一.简单的汇编程序 以下面这段简单的汇编代码为例 .section .data .section .text .globl _start _start: movl $1, %eax movl $4, %ebx int $0x80 (注意是globl不是global:movl(MOVL)不是mov1(MOV一)) 将这段程序保存为demo.s,然后用汇编器as把汇编程序中的助记符翻译成机器指令(汇编指令与机器指令是对应的)生成目标文件demo.o.然后用链接器ld把目标文件demo.o链接成可执行

ARM汇编基础(1)--ADS1.2安装与第一个ARM汇编程序

前言 最近的工作是与逆向相关, 用到ARM汇编, 以前在大学时学过x86汇编和ARM开发, 自我感觉当时学的还挺好, 很久没用也生疏了. 正好趁着这个机会也复习一下ARM汇编. 关于ARM的介绍和理论知识,此处就不再赘述. 进入正题: 安装ADS1.2 安装过程很简单, 没什么技术含量. 但是, win7可能会碰到卡在100%的问题, 网上有很多解决的办法, 但好像都不管用. 我用XP的虚拟机装的ADS1.2, 在XP系统上安装很顺利. 第一个ARM汇编程序 新建一个工程, 然后再按照一下步骤设

keil:C语言里面调用汇编程序

C语言直观,汇编效率高,C里面嵌入汇编是很好的选择. 路径大概如图: mian.c是我的C语言程序,Func.s是汇编程序. 主要是Init_1这个函数的实现在汇编文件里面,使用汇编实现的. 首先在C里面用 extern 声明 Init_1这个函数,再在main里面调用好了. 然后在汇编里面用EXPORT Init_1与C联系起来就可以了.

用IO检测方式判断交流220V与110V(松瀚汇编程序)

;-----------------------代码------------------------------------------ ;---220V/110V检测-------------------- V_CH220NUM EQU 10 ;检测上半波的个数 ;150V-0 180V-80 220V-120 V_220VNUM EQU 60 ;电压信号为高的总个数 //*************************************** // 函数名称: DLY500US //

小甲鱼零基础汇编语言学习笔记第四章之第一个汇编程序

1.使用工具 代码编写:NotePad++,代码编译器:MASM 2.一个源程序从写出到执行的过程 第一步,使用文本编辑器,用汇编语言编写汇编源程序,这一步产生一个存储源程序的文本文件. 第二步,对源程序进行编译,连接.使用MASM.exe对源程序文件进行编译,产生目标文件,再使用LINK.exe对目标文件进行连接,生成可在操作系统中直接运行的可执行文件.可执行文件包括两个部分,程序(从源程序的汇编指令翻译过来的机器码)和数据(源程序中定义的数据):相关的描述信息 (程序有多大,要占多少内存空间

一段简单的汇编程序

.section .data < initialized data here > .section .bss < uninitialized data here > .section .text .global _start _start: < instruction code > 如上述代码所示,汇编程序通常包含3个段(section): data section bss section text section GNU assembler使用.section语句来声

使用Visual Studio 2013 调试 MASM 汇编程序!

原文地址:http://kipirvine.com/asm/debug/vstudio2013/index.htm Using the Microsoft Visual Studio 2013 Debugger Updated 6/21/2014 This tutorial explains how to use the Microsoft Visual Studio 2013 Debugger to debug 32-bit assembly language programs running

“Hello World”—— 第一个汇编程序

Hello World这是每一门编程语言的第一个最简单程序,下面那个程序就是汇编语言的Hello World.学汇编一段时间了,到现在才记录下自己的第一个汇编程序笔记.虽然这是个相当简单的小程序,但这也算是一个开始吧,有了开始,以后自己的笔记也许才会更新的更勤. Assembly (x86) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 stack      segment stack 'stack' dw 32 dup(0) stack