Skip to content

课堂测试题目整理

课堂测试题目将会按照章节整理

序号 易错点 备注
1 十六进制数表示规范 注意在汇编考试中,十六进制数如果结果以字母开头需要前缀加0,后缀加h(0FFFFFh)

第一章 汇编语言基本概念

题目一:汇编、C++、Java、Python语言出现时间顺序

\[Assembly < C++ < Python < Java\]

第二章 IA32处理器结构

题目一:CPU内部包括哪些基本部件?

\[ALU,CU,Register,Clock\]

题目二:CPU、总线、内存这三个设备哪个时钟频率最高?

\[Solution: CPU\]

题目三:数据在CPU中存储的位置

\[Register 寄存器\]

题目四:一条CPU指令的执行周期包括哪些操作? 其中占用时间最多的操作有哪些

+ 取指令
+ 解码:控制单元CU确定执行什么操作
+ 取操作数:从内存中读操作数
+ 执行:ALU中执行
+ 存储输出操作数:向内存中写入

在这些操作中,通常占用时间最多的操作是取操作数和执行

题目五:哪种操作模式(保护模式/实地址模式/虚拟8086模式),程序可以拥有4GB的地址模式?

\[Solution:保护模式\]

题目六:高级语言的if、for、while等的条件判断过程在CPU中是如何实现

  • 比较操作:CPU首先执行相关的比较指令,比如比较两个寄存器的值。比较结果会设置状态寄存器中的标志位(如零标志位、符号标志位等)。
  • 条件跳转:根据标志位的状态,CPU会执行条件跳转指令(如JZ、JNZ等),跳转到对应的代码块。

第四章 数据传送、寻址和算数运算

题目一ECX = 0时LOOP循环执行次数是多少?


\[Solution:\;\; The\;\; answer\;\; is\;\; 2^{32}\]

题目二:数组求和程序书写

给出一个数组array DWORD 100h,200h,300h,400h

\[Solution:\;\; The\;\; anwer \;\;is\;\;below\]
.data
  array DWORD 100h,200h,300h,400h
.code
  MOV ECX,LENGTHOF array
  MOV EDI,OFFSET array
  MOV EAX,0
L1:
  ADD EAX,[EDI]
  ADD EDL,TYPE array
  LOOP L1

题目三:字符串赋值程序书写

给出一个字符串str BYTE "Hello Word",0DH,0AH,0

\[Solution:\;\; The\;\; anwer \;\;is\;\;below\]
.data
  src BYTE "Hello Word",0DH,0AH,0
  dst BYTE SIZEOF srcDUP(0),0
.code
  MOV ECX,SIZEOF src
  MOV ESI,0
L1:
  MOV AL,BYTE PTR src[ESI]
  MOV BYTE PTR dst[ESI],AL
  INC ESI
  LOOP L1

题目四:将数组num BYTE 0,1,2,3,4,5,6,7,8,9转换为ASCII码

.data 
  BYTE 1,2,3,4,5,6,7,8,9,10
.code
  MOV ECX,10
  MOV ESI,0
L1:
  MOV AL,BYTE PTR num[ESI]
  ADD AL,30h
  MOV BYTE PTR num[ESI],AL
  INC ESI
  LOOP L1

题目五:如何访问下面数组var1 DWORD 100h,200h,300h中的内存值200h?

\[Solution:\;\; The\;\; anwer \;\;is\;\;below\]
.code
  mov eax,[var1 + 4] ;注意这里是4而不是1!注意数据类型宽度

题目六inc [eax]为什么会报错?

在汇编程序运行中,INC指令只有一个操作数,而上面的代码并没有告诉INC指令操作的宽度,不知道加DOWRD还是其他的数据类型宽度。

我们修改的思路如下:

  • MOV间接增加地址:
MOV EBX, [EAX]   ; 将 EAX 指向的内存值加载到 EBX
INC EBX          ; 对 EBX 的值加1
MOV [EAX], EBX   ; 将加1后的值存回 EAX 指向的内存地址
  • 增加数据类型宽度
INC DWORD PTR [eax]

题目七:内存地址指针的尺寸大小

\(Solution:\)只要不是段寄存器,我们认为无论指针指向什么类型的数据,指针的尺寸都是4 BYTE

第五章 汇编过程

题目一IncludeIncludelib的区别

INCLUDE

  • 用于包含头文件(.inc 文件)。
  • 会将文件的内容直接插入到代码中。
  • 用于声明函数、变量、常量、结构等。

INCLUDELIB

  • 用于包含库文件(.lib 文件)。
  • 不插入文件内容,只告诉链接器在哪找函数实现。
  • 用于链接预编译的库文件(如 Windows API

题目二:根据函数调用过程和栈的增长方向,函数参数,函数返回地址,函数的局部变量的内存地址的高低排序?

\[函数参数 > 函数返回地址 > 函数的局部变量\]

题目三:当前ESP寄存器的值是07001000h,“push 10h”指令执行之后,esp寄存器的值是多少?

\[ esp - 4 = 0700ffc\mathbf{h}\]

第六章 华为鲲鹏处理器

题目一 「LDR、MOV、ADD、STR」这些ARM指令可以访问内存

题目二 寄存器R0的值是多少?

MOV R1, #5
MOV R0,R1,LSL #2

题目三 按照下面的代码,请写出LDMIA指令执行之后R1寄存器的值?R6寄存器存储数据的内存地址?

LDR R1,#0x10000000
LDMIA R1!,{R0,R4-R6}

题目四 按照下面的代码,请写出STMDB指令执行之后R1寄存器的值?R5寄存器的值写入的内存地址?

MOV R1,#0x1000000C
STMDB R1!,{R4-R6}

题目五 ARMv8支持4种栈的生长管理方式:FA、FD、EA、ED,那么x86CPU支持哪种栈的生长方式?

题目六 SP寄存器的值是0x100000010,指令STMFD SP!,{R2-R4}执行之后,SP寄存器的值是多少?

题目七 64位ARM指令集是:

A. Thumb指令集 B、A64指令集 C、T32指令集 D、A32指令集
\[Solution:B\]

第七章

题目一:内存属性有哪些?

可读性、可写性、可执行性

题目二:一个进程的虚拟地址空间只有一个PE文件结构

还有内核,4GB中有一半给到Windows操作系统2的内核产生链接

题目三:进程的内存空间中有多个模块。模块在内存中的位置是固定的吗?字符串、全局变量、函数等内存地址是固定的吗?

不是固定的,因为模块的地址冲突问题 - 模块的加载顺序和加载地址是不确定的

题目四:hello.exe在内存中的基地址(ImageBase)是00400000h,入口点的相对虚拟地址RVA(hello.exe执行的第一条CPU指令的相对虚拟地址)是00001000h,hello.exe的入口点虚拟地址VA是 ?

\[00401000h\]

题目五:PE文件的开头是确定的嘛?PE文件开始的两个字节是?

确定的,是50 45

题目六:如何通过DOS Stub结构找到PE头在文件中的位置?

  • 定位DOS Header: 在PE文件的开头,DOS头位于偏移地址0x00处,结构是IMAGE_DOS_HEADER
  • 查看e_lfanew字段: IMAGE_DOS_HEADER结构中包含一个e_lfanew字段,该字段是一个DWORD类型的变量,位于0x3C偏移处。这个字段指向PE头的实际偏移位置,它表示PE头在文件中的偏移地址

题目七hello.exe的PE结构中Character值是010Fh,说明hello.exe的文件属性是什么?

分析Characteristics字段是基于PE文件结构的标准定义。每个Characteristics位标志代表PE文件的不同属性。这是一个16位的字段,每一位或组合的位可以表示不同的文件特性。因此,分析这个字段需要将其值转换为二进制,然后检查每个位的含义。

  1. 读取和转换值: PE文件的Characteristics字段值010Fh(十六进制)需要转换为二进制表示,这样我们可以更容易地检查每一位是否设置。

    010Fh = 0000 0001 0000 1111b
    
    这表示设置了低4位和第8位为1。
  2. 查阅PE文件规范: 根据PE/COFF(Common Object File Format)规范,每个位标志的含义如下:

  3. 位0 (0x0001)IMAGE_FILE_RELOCS_STRIPPED - 文件中不包含重定位信息。
  4. 位1 (0x0002)IMAGE_FILE_EXECUTABLE_IMAGE - 表示这是一个可执行的映像文件。
  5. 位2 (0x0004)IMAGE_FILE_LINE_NUMS_STRIPPED - 文件中不包含行号信息(通常用于调试)。
  6. 位3 (0x0008)IMAGE_FILE_LOCAL_SYMS_STRIPPED - 文件中不包含局部符号。
  7. 位8 (0x0100)IMAGE_FILE_32BIT_MACHINE - 表示文件适用于32位机器。

  8. 检查每一位: 将0000 0001 0000 1111b对照上述含义,我们看到低4位和第8位被设置为1。这意味着010Fh表示以下属性:

  9. 文件是一个可执行文件(IMAGE_FILE_EXECUTABLE_IMAGE)。
  10. 文件不包含重定位信息(IMAGE_FILE_RELOCS_STRIPPED)。
  11. 文件不包含行号和局部符号信息(IMAGE_FILE_LINE_NUMS_STRIPPEDIMAGE_FILE_LOCAL_SYMS_STRIPPED)。
  12. 文件是适用于32位机器的可执行文件(IMAGE_FILE_32BIT_MACHINE)。

题目八VirtualSize是否需要与SizeOfRawData一致?

不,VirtualSize可能会更大,因为程序在执行过程中,从硬盘向内存空间释放可能存在解压缩/解密过程,所需要的空间会更大

题目九:PE文件在内存中的映射位置如图所示,相对内存地址RVA=2123h的数据在PE文件中Offset是?

.data 723h

题目十:C++编程中include得函数代码是否存储在.text代码节当中?

不在,应该存储在导入表IAT当中

题目十一:函数名字符串存储在哪个数据结构中?

A.IAT B.INT C.IID D.IMAGE_IMPORT_BY_NAME
\[Solution:D\]

易错点:函数名字符串存储

INT存储的是函数名字符串的相对虚拟地址(RVA) IMAGE_IMPORT_BY_NAME存储的正是每一个函数名字符串

题目十二:导入表有哪些安全问题?如何进行安全巩固?

第八章节 逆向工程

题目一:以下哪些选项可以在Binary Ninja中被搜索

A. 文本 B.常数 C.通配符 D.字节序列
\[Solution:ABCD\]

题目二

第九章 动态逆向工程

题目一:x64dbg中可以修改以下哪些内容?

答:内存数据、CPU寄存器、栈上的数据、CPU指令

题目二:如何解决和避免dll的重定位问题?

1. 使用不同的Image Base地址
2. .reloc节记录需要修改的信息

错误的答案解析

这道题目中高错误的一个答案就是“指定dll装载程序”,这是不行的,因为dll装载的顺序是Windows固定的

题目三:以下哪些是线程私有的?

答:栈、寄存器

错误的答案解析

内存空间、代码都是统一编码的,是公有的,所以不是私有的。

题目四:硬件断点同时最多可以设置几个?

答:4个

第十章节 C语言逆向分析

题目一:ESP是0019FF6Ch,[ESP]的值是0040100Fh,retn 4指令执行之后,ESP的值和EIP的值是多少?

答:ESP = 0019FF6C-8 = 0019FF64h,EIP = [ESP] = 0040100Fh