第一次遇见16位,和纯看汇编的题目,记录一下

DIE

16位,IDA用32位或者64位都可以打开

IDA

主要汇编部分

seg003:0000 ; =============== S U B R O U T I N E =======================================
seg003:0000
seg003:0000 ; Attributes: noreturn
seg003:0000
seg003:0000 public start
seg003:0000 start proc near
seg003:0000 mov ax, seg dseg
seg003:0003 mov ds, ax ; 数据段寄存器ds。
seg003:0005 assume ds:dseg
seg003:0005 mov ax, seg seg001 ; 告诉汇编器ds寄存器现在指向dseg段。
seg003:0008 mov es, ax ; 额外段寄存器es。
seg003:000A assume es:seg001
seg003:000A mov si, 0 ; 告诉汇编器es寄存器现在指向seg001段。
seg003:000A ; 将寄存器si置零,用于遍历数组或字符串。
seg003:000D
seg003:000D loc_100DD: ; CODE XREF: start+38↓j
seg003:000D cmp si, 28 ; 比较寄存器si的值与28(即检查是否已经处理了28个字节)。
seg003:0010 jz short loc_10135 ; 成功跳转
seg003:0010 ; 如果si等于28,跳转到标签loc_10135。
seg003:0012 xor ax, ax ; 将寄存器ax清零。
seg003:0014 mov al, [si] ; 将ds:[si]处的字节值加载到al(si是索引寄存器,指向当前要处理的数据字节)。
seg003:0016 shl al, 1
seg003:0018 shl al, 1
seg003:001A shl al, 1
seg003:001C shl al, 1 ; 将al中的值左移4次(每次左移一位,相当于乘以16)。
seg003:001E push ax ; 将ax的值压入堆栈。
seg003:001F xor ax, ax ; 将寄存器ax清零。
seg003:0021 mov al, [si] ; 将ds:[si]处的字节值再次加载到al。
seg003:0023 shr al, 1
seg003:0025 shr al, 1
seg003:0027 shr al, 1
seg003:0029 shr al, 1 ; 将al中的值右移4次(每次右移一位,相当于除以16)。
seg003:002B pop bx ; 将堆栈中的值,即左移处理后的值,弹出到寄存器bx。
seg003:002C add ax, bx ; 将ax和bx的值相加,结果存入ax。
seg003:002E xor ax, 17h ; 将ax的值与17h(23十进制)异或。
seg003:0031 add si, 1 ; 将si加1,指向下一个字节。
seg003:0034 cmp al, es:[si-1] ; 将al中的值与es:[si-1]处的值比较。
seg003:0038 jz short loc_100DD ; 如果相等,跳回到标签loc_100DD继续处理下一个字节。
seg003:003A mov ax, 0B800h ; 将视频内存段地址B800h加载到ax。
seg003:003D mov es, ax ; 将寄存器ax的值(即视频内存段地址B800h)加载到额外段寄存器es。
seg003:003F assume es:nothing
seg003:003F mov byte ptr es:0, 77h ; 'w' ; 告诉汇编器es寄存器现在指向视频内存段。
seg003:0045 mov byte ptr es:2, 72h ; 'r'
seg003:004B mov byte ptr es:4, 6Fh ; 'o'
seg003:0051 mov byte ptr es:6, 6Eh ; 'n'
seg003:0057 mov byte ptr es:8, 67h ; 'g'
seg003:005D mov byte ptr es:0Ah, 21h ; '!' ; 将字符串“wrong!”依次写入视频内存,显示在屏幕上。
seg003:0063
seg003:0063 loc_10133: ; CODE XREF: start:loc_10133↓j
seg003:0063 jmp short loc_10133 ; 无限循环,使程序停止在此。
seg003:0065 ; ---------------------------------------------------------------------------
seg003:0065
seg003:0065 loc_10135: ; CODE XREF: start+10↑j
seg003:0065 mov ax, 0B800h
seg003:0068 mov es, ax
seg003:006A mov byte ptr es:0, 72h ; 'r'
seg003:0070 mov byte ptr es:2, 69h ; 'i'
seg003:0076 mov byte ptr es:4, 67h ; 'g'
seg003:007C mov byte ptr es:6, 68h ; 'h'
seg003:0082 mov byte ptr es:8, 74h ; 't'
seg003:0088 mov byte ptr es:0Ah, 21h ; '!' ; 将字符串“right!”依次写入视频内存,显示在屏幕上。
seg003:008E
seg003:008E loc_1015E: ; CODE XREF: start:loc_1015E↓j
seg003:008E jmp short loc_1015E ; 无限循环,使程序停止在此。
seg003:008E start endp
seg003:008E
seg003:008E seg003 ends
seg003:008E
seg003:008E
seg003:008E end start

dseg段

dseg:0000 ; Segment type: Pure data
dseg:0000 dseg segment para public 'DATA' use16
dseg:0000 assume cs:dseg
dseg:0000 aHgameFillInYou db 'hgame{Fill_in_your_flag}',0
dseg:0019 db 0
dseg:001A db 0
dseg:001B db 0
dseg:001C db 0
dseg:001D db 0
dseg:001E db 0
dseg:001F db 0
dseg:0020 db 0
dseg:0021 db 0
dseg:0022 db 0
dseg:0023 db 0
dseg:0024 db 0
dseg:0025 db 0
dseg:0026 db 0
dseg:0027 db 0
dseg:0028 db 0
dseg:0029 db 0
dseg:002A db 0
dseg:002B db 0
dseg:002C db 0
dseg:002D db 0
dseg:002E db 0
dseg:002F db 0
dseg:002F dseg ends

seg001段

seg001:0000 ; Segment type: Regular
seg001:0000 seg001 segment byte public 'UNK' use16
seg001:0000 assume cs:seg001
seg001:0000 assume es:nothing, ss:nothing, ds:dseg, fs:nothing, gs:nothing
seg001:0000 db 91h
seg001:0001 db 61h ; a
seg001:0002 db 1
seg001:0003 db 0C1h
seg001:0004 db 41h ; A
seg001:0005 db 0A0h
seg001:0006 db 60h ; `
seg001:0007 db 41h ; A
seg001:0008 db 0D1h
seg001:0009 db 21h ; !
seg001:000A db 14h
seg001:000B db 0C1h
seg001:000C db 41h ; A
seg001:000D db 0E2h
seg001:000E db 50h ; P
seg001:000F db 0E1h
seg001:0010 db 0E2h
seg001:0011 db 54h ; T
seg001:0012 db 20h
seg001:0013 db 0C1h
seg001:0014 db 0E2h
seg001:0015 db 60h ; `
seg001:0016 db 14h
seg001:0017 db 30h ; 0
seg001:0018 db 0D1h
seg001:0019 db 51h ; Q
seg001:001A db 0C0h
seg001:001B db 17h
seg001:001C db 0
seg001:001D db 0
seg001:001E db 0
seg001:001F db 0
seg001:001F seg001 ends

shift+E提取出来

0x91, 0x61, 0x01, 0xC1, 0x41, 0xA0, 0x60, 0x41, 0xD1, 0x21,
0x14, 0xC1, 0x41, 0xE2, 0x50, 0xE1, 0xE2, 0x54, 0x20, 0xC1,
0xE2, 0x60, 0x14, 0x30, 0xD1, 0x51, 0xC0, 0x17

疑问:0B800h为什么是视频内存?

x86汇编语言之显存操控屏幕输出

操控显存输出字符串

前面咱们介绍过使用中断的方式输出字符串, 今天我们学习一种不使用中断的方式实现字符串的打印

在8086的内存地址结构中,B8000H~BFFFFH这部分的内存区域为显存区域,一旦向这个地址空间写入数据,cpu会从0号偏移地址开始读取数据然后显示输出, (每写入一次数据就从0开始读取一次)

代码尝试:

start:
mov ax,0B800H
mov ds,ax mov dl,'a'
mov ds:[0],dl
end start

在这块区域中,每个字符固定占用两个字节的空间,也就是ds:[0]ds:[1]存放一个字符的信息,前者存放字符具体的内容,后者存放字符对应的颜色

比如:

start:
mov ax,0B800H
mov ds,ax mov dl,'a'
mov ds:[0],dl mov dl,00000100B ;让字符以红色显示
mov ds:[1],dl
end start
作者:乱码三千
链接:https://juejin.cn/post/7028744851805978638
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 
汇编都标注好了注释,逻辑不难理解
将dseg的每个字节左移与右移的结果相加,再进行异或操作,最后与seg001比较

EXP

 1 flag = ''
2
3 seg001 = [
4 0x91, 0x61, 0x01, 0xC1, 0x41, 0xA0, 0x60, 0x41, 0xD1, 0x21,
5 0x14, 0xC1, 0x41, 0xE2, 0x50, 0xE1, 0xE2, 0x54, 0x20, 0xC1,
6 0xE2, 0x60, 0x14, 0x30, 0xD1, 0x51, 0xC0, 0x17
7 ]
8
9 for i in seg001:
10 add = i ^ 23
11 temp1 = add >> 4 # 低位
12 temp2 = add << 4 # 高位
13 flag += chr((temp1 + temp2) & 0xFF)  ##第一次漏了,报错:TypeError: ord() expected string of length 1, but int found
14
15 print(flag)

flag

hgame{welc0me_to_4sm_w0rld}

16位简单ASM题的记录——[HGAME 2022 week1]easyasm的更多相关文章

  1. 2021.12.16 eleveni的刷题记录

    2021.12.16 eleveni的刷题记录 1. 数论 https://www.luogu.com.cn/problem/P2532 1.1卡特兰数 https://www.luogu.com.c ...

  2. [原]Sublime Text3 搭建16位汇编环境(windows)

    最近在学习王爽的<汇编程序>,参考<简单OS开发前奏<一>EDITPLUS+MASM32搭建汇编开发环境(16位+32位)>http://www.cnblogs.c ...

  3. 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)<转>

    颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别简单地说这里说的位数和windows系统显示器设置中的颜色位数是一样的.表示的是能够显示出来的颜色的多少. 8位的意思是说,能够显示出 ...

  4. 计算机二级C语言选择题错题知识点记录。

    计算机二级C语言选择题错题知识点记录. 1,在数据流图中,用标有名字的箭头表示数据流.在程序流程图中,用标有名字的箭头表示控制流. 2,结构化程序设计的基本原则:自顶向下,逐步求精,模块化,限制使用g ...

  5. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码

    不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...

  6. 16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

    ;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.as ...

  7. [ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)

    1.定时器1概述 定时器1 是一个支持典型的定时/计数功能的独立16 位定时器,支持输入捕获,输出比较和PWM等功能.定时器有五个独立的捕获/比较通道.每个通道定时器要使用一个I/O 引脚.定时器用于 ...

  8. [Effective JavaScript 笔记] 第7条:视字符串为16位的代码单元序列

    Unicode编码,基础:它为世界上所有的文字系统的每个字符单位分配一个唯一的整数,该整数介于0~1114111之间,在Unicode术语中称为代码点(code point). 和其它字符编码几乎没有 ...

  9. 对所有CPU寄存器的简述(16位CPU14个,32位CPU16个)

    32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI)2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1 ...

  10. JMeter-Eclipse添加自定义函数 MD5加密 32位和16位

    最近公司的接口都是MD5  16位加密,所以要使用加密功能. 之前也做过加密,因为用的比较少,所以是写了一个加密方法,导出JAR包,调用的.用起来需要很多设置,并且换算效率也不高.听前同事说,jmet ...

随机推荐

  1. Lattice下载器高速编程器HW-USBN-2B fpga仿真器ispdown烧录器

    1.概述 HW-USBN-2B 编程烧录Lattice所有芯片,速度非常快.支持Lattice FPGA芯片在线稳定仿真.烧录.加密,支持Lattice CPLD烧录.支持外部配置FLASH.PROM ...

  2. ES6中Module以及使用场景

    一.介绍 模块,(Module),是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体). 两个基本的特征:外部特征和内部特征 外部特征是指模块跟外部环境联系的接口(即其他 ...

  3. CentOS7.9 systemctl

    目录 命令格式 语法 加载配置文件 关机和开机 unit 文件存放位置 unit 格式说明 service unit file 文件构成部分 unit 段的常用选项 service 段的常用选项 in ...

  4. Stable Diffusion中的常用术语解析

    Stable Diffusion中的常用术语解析 对于很多初学者来说,会对Stable Diffusion中的很多术语感到困惑,当然你不是唯一的那个. 在这篇文章中,我将会讲解几乎所有你在Stable ...

  5. 以“升舱”之名,谈谈云原生数据仓库AnalyticDB的核心技术

    简介: 企业级云原生数据仓库AnalyticDB提出了升舱计划,旨在承担和帮助金融.运营商.政务等行业构建下一代数据管理和分析系统,以应对不断增长的数据规模,业务数字化转型,和传统数仓替换升级需求.7 ...

  6. 比心云平台基于阿里云容器服务 ACK 的弹性架构实践

    ​简介:本文主要探讨比心云平台如何利用阿里云容器服务 ACK,来构建应用弹性架构,进一步优化计算成本. 作者:韩韬|比心技术 前言 应用容器化改造后,不可避免地会面临这样一个问题:Kubernetes ...

  7. 逸仙电商Seata企业级落地实践

    简介: 本文将会以逸仙电商的业务作为背景, 先介绍一下seata的原理, 并给大家进行线上演示, 由浅入深去介绍这款中间件, 以便读者更加容易去理解 Seata 这个中间件. 作者 | 张嘉伟(Git ...

  8. [FAQ] Error: Component series.bar not exists. Load it first. (echarts)

    以上错误出现在使用 echarts 组件时,未导入或者使用不正确的情况下. 检查是否导入 line 或者 bar 这一类具体的 chart,比如: import 'echarts/lib/chart/ ...

  9. 国内常用源开发环境换源(flutter换源,python换源,Linux换源,npm换源)

    国内开源镜像站点 大学 清华大学开源软件镜像站 (使用较多) 中国科学技术大学开源软件镜像 (使用较多) 浙江大学开源镜像站 (主要是各发行版Linux,pip等常用库) 哈尔滨工业大学开源镜像站 ( ...

  10. linux应用程序开发入门

    在上一篇文章中学习了linux字符驱动的开发,需要使用应用程序对完成的驱动进行验证,现在开始学习应用程序的开发. 一.准备材料 开发环境:VMware 操作系统:ubuntu 开发版:湃兔i2S-6U ...