课堂测试题目整理¶
课堂测试题目将会按照章节整理
序号 | 易错点 | 备注 |
---|---|---|
1 | 十六进制数表示规范 | 注意在汇编考试中,十六进制数如果结果以字母开头需要前缀加0,后缀加h(0FFFFFh) |
第一章 汇编语言基本概念¶
题目一:汇编、C++、Java、Python语言出现时间顺序
第二章 IA32处理器结构¶
题目一:CPU内部包括哪些基本部件?
题目二:CPU、总线、内存这三个设备哪个时钟频率最高?
题目三:数据在CPU中存储的位置
题目四:一条CPU指令的执行周期包括哪些操作? 其中占用时间最多的操作有哪些
+ 取指令
+ 解码:控制单元CU确定执行什么操作
+ 取操作数:从内存中读操作数
+ 执行:ALU中执行
+ 存储输出操作数:向内存中写入
在这些操作中,通常占用时间最多的操作是取操作数和执行。
题目五:哪种操作模式(保护模式/实地址模式/虚拟8086模式),程序可以拥有4GB的地址模式?
题目六:高级语言的if、for、while等的条件判断过程在CPU中是如何实现
- 比较操作:CPU首先执行相关的比较指令,比如比较两个寄存器的值。比较结果会设置状态寄存器中的标志位(如零标志位、符号标志位等)。
- 条件跳转:根据标志位的状态,CPU会执行条件跳转指令(如JZ、JNZ等),跳转到对应的代码块。
第四章 数据传送、寻址和算数运算¶
题目一:ECX = 0
时LOOP循环执行次数是多少?
题目二:数组求和程序书写
给出一个数组array DWORD 100h,200h,300h,400h
.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
.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
?
.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
第五章 汇编过程¶
题目一:Include
和Includelib
的区别
INCLUDE
:
- 用于包含头文件(.inc 文件)。
- 会将文件的内容直接插入到代码中。
- 用于声明函数、变量、常量、结构等。
INCLUDELIB
:
- 用于包含库文件(.lib 文件)。
- 不插入文件内容,只告诉链接器在哪找函数实现。
- 用于链接预编译的库文件(如 Windows API
题目二:根据函数调用过程和栈的增长方向,函数参数,函数返回地址,函数的局部变量的内存地址的高低排序?
题目三:当前ESP寄存器的值是07001000h,“push 10h”指令执行之后,esp寄存器的值是多少?
第六章 华为鲲鹏处理器¶
题目一 「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指令集是:
第七章¶
题目一:内存属性有哪些?
题目二:一个进程的虚拟地址空间只有一个PE文件结构
题目三:进程的内存空间中有多个模块。模块在内存中的位置是固定的吗?字符串、全局变量、函数等内存地址是固定的吗?
题目四:hello.exe在内存中的基地址(ImageBase)是00400000h,入口点的相对虚拟地址RVA(hello.exe执行的第一条CPU指令的相对虚拟地址)是00001000h,hello.exe的入口点虚拟地址VA是 ?
题目五:PE文件的开头是确定的嘛?PE文件开始的两个字节是?
题目六:如何通过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位的字段,每一位或组合的位可以表示不同的文件特性。因此,分析这个字段需要将其值转换为二进制,然后检查每个位的含义。
-
读取和转换值: PE文件的
Characteristics
字段值010Fh
(十六进制)需要转换为二进制表示,这样我们可以更容易地检查每一位是否设置。这表示设置了低4位和第8位为1。010Fh = 0000 0001 0000 1111b
-
查阅PE文件规范: 根据PE/COFF(Common Object File Format)规范,每个位标志的含义如下:
- 位0 (
0x0001
):IMAGE_FILE_RELOCS_STRIPPED
- 文件中不包含重定位信息。 - 位1 (
0x0002
):IMAGE_FILE_EXECUTABLE_IMAGE
- 表示这是一个可执行的映像文件。 - 位2 (
0x0004
):IMAGE_FILE_LINE_NUMS_STRIPPED
- 文件中不包含行号信息(通常用于调试)。 - 位3 (
0x0008
):IMAGE_FILE_LOCAL_SYMS_STRIPPED
- 文件中不包含局部符号。 -
位8 (
0x0100
):IMAGE_FILE_32BIT_MACHINE
- 表示文件适用于32位机器。 -
检查每一位: 将
0000 0001 0000 1111b
对照上述含义,我们看到低4位和第8位被设置为1。这意味着010Fh
表示以下属性: - 文件是一个可执行文件(
IMAGE_FILE_EXECUTABLE_IMAGE
)。 - 文件不包含重定位信息(
IMAGE_FILE_RELOCS_STRIPPED
)。 - 文件不包含行号和局部符号信息(
IMAGE_FILE_LINE_NUMS_STRIPPED
和IMAGE_FILE_LOCAL_SYMS_STRIPPED
)。 - 文件是适用于32位机器的可执行文件(
IMAGE_FILE_32BIT_MACHINE
)。
题目八:VirtualSize
是否需要与SizeOfRawData
一致?
题目九:PE文件在内存中的映射位置如图所示,相对内存地址RVA=2123h的数据在PE文件中Offset是?
题目十:C++编程中include得函数代码是否存储在.text代码节当中?
题目十一:函数名字符串存储在哪个数据结构中?
易错点:函数名字符串存储
INT存储的是函数名字符串的相对虚拟地址(RVA) IMAGE_IMPORT_BY_NAME存储的正是每一个函数名字符串
题目十二:导入表有哪些安全问题?如何进行安全巩固?
第八章节 逆向工程¶
题目一:以下哪些选项可以在Binary Ninja中被搜索
题目二:
第九章 动态逆向工程¶
题目一:x64dbg中可以修改以下哪些内容?
题目二:如何解决和避免dll的重定位问题?
错误的答案解析
这道题目中高错误的一个答案就是“指定dll装载程序”,这是不行的,因为dll装载的顺序是Windows固定的
题目三:以下哪些是线程私有的?
错误的答案解析
内存空间、代码都是统一编码的,是公有的,所以不是私有的。
题目四:硬件断点同时最多可以设置几个?
第十章节 C语言逆向分析¶
题目一:ESP是0019FF6Ch,[ESP]的值是0040100Fh,retn 4指令执行之后,ESP的值和EIP的值是多少?