《逆向工程权威指南》—第3章3.7节练习题

**3.7 练习题
3.7.1 题目1 **
请描述下述32位函数的功能。

main:
     push 0xFFFFFFFF
     call MessageBeep
     xor  eax,eax
     retn

3.7.2 题目2
请描述Linux函数的功能,这里使用了AT&T汇编语言语法。

main:
     pushq   %rbp
     movq    %rsp, %rbp
     mov1    %2, %edi
     call    sleep
     popq    %rbp
     ret

[1] Brian W. Kernighan. The C Programming Language. Ed. by Dennis M. Ritchie. 2nd. Prentice Hall Professional Tech- nical Reference, 1988. ISBN: 0131103709。

[2] 但是CPU 标志位会发生变化。

[3] 参见http://en.wikipedia.org/wiki/Exclusive_or

[4] C runtime library:sec:CRT,参见本书68.1节。

[5] 参考Wikipedia:Data structure alignment http://en.wikipedia.org/wiki/Data_structure_ alignment。

[6] 参考Mit13。

[7] 参考Int13。

[8] 可通过菜单“Options Number of opcode bytes”启用有关选项。

[9] 请参考Mit13。

[10] Apple公司的Xcode 4.6.3使用的前段编译器是开源的GCC程序,代码生成程序(code generator)使用的是LLVM。

[11] 例如,ARM模式的指令集里没有PUSH/POP指令。

[12] STMFD是Storage Multiple Full Descending 的缩写。

[13] stack pointer,栈指针。x86/x64框架中的SP是SP/ESP/RSP,而ARM框架的SP就是SP。

[14] Program Counter,中文叫做指令指针或程序计数器。x86/x64里的PC叫作IP/EIP/RIP,ARM里它就叫PC。

[15] 本书介绍操作系统的部分有更详细的说明。在不同框架的汇编语言中,PC很少会是当前指令的指针地址+1,这和CPU的流水/pipeline模式有关。如需完整的官方介绍,请参阅http://www.arm. com/pdfs/comparison-arm7-arm9-v1.pdf。

[16] BL是Branch with Link的缩写,相当于x86的call指令。

[17] 这是二进制里26位有符号整型数据(26 bits signed int)的数值范围。

[18] LDMFD是Load Multiple Full Descending的缩写。

[19] 参照参考文献App10。

[20] Xcode 4.6.3是基于GCC的编译器。

[21] 请参考http://www.ciselant.de/projects/gcc_printf/gcc_printf.html

[22] 请参考前文介绍的分支延迟槽(Branch delay slot)效应。

[23] 有关MIPS各寄存器的用途,请参见附录C.1。

[24] 很明显,对于GCC的用户来说,查看汇编指令的功能不是那么重要。所以,GCC输出的汇编指令之中仍然可能存在一些(在生成汇编指令的阶段)未被修正的错误。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-09-16 12:46:17

《逆向工程权威指南》—第3章3.7节练习题的相关文章

《逆向工程权威指南》—第3章3.节x86

第3章 Hello,world!逆向工程权威指南现在,我们开始演示<C语言编程>一书[1]中著名的程序: #include <stdio.h> int main() { printf("hello, world\n"); return 0; }; 3.1 x863.1.1 MSVC接下来我们将通过下述指令,使用MSVC 2010编译下面这个程序. cl 1.cpp /Fa1.asm其中/Fa选项将使编译器生成汇编指令清单文件(assembly listing f

《逆向工程权威指南》—第1章1.1节指令集架构

第一部分 指令讲解逆向工程权威指南在最初接触C/C++时,我就对程序编译后的汇编指令十分着迷.按照从易到难的顺序,我循序渐进地研究了C/C++语言编译器生成汇编指令的模式.经过日积月累的努力,现在我不仅可以直接阅读x86程序的汇编代码,而且能够在脑海里将其还原成原始的C/C++语句.我相信这是学习逆向工程的有效方法.为了能够帮助他人进行相关研究,我把个人经验整理成册,以待与读者分享. 本书包含大量x86/x64和ARM框架的范例.如果读者熟悉其中某一种框架,可以跳过相关的篇幅. 第1章 CPU简

《逆向工程权威指南》—第2章2.1节x86

第2章 最简函数逆向工程权威指南返回预定常量的函数,已经算得上是最简单的函数了. 本章围绕下列函数进行演示: 指令清单2.1 C/C++ 代码 int f() { return 123; }; 2.1 x86在开启优化功能之后,GCC编译器产生的汇编指令,如下所示. 指令清单2.2 Optimizing GCC/MSVC(汇编输出) f: mov eax, 123 ret MSVC编译的程序和上述指令完全一致. 这个函数仅由两条指令构成:第一条指令把数值123存放在EAX寄存器里:根据函数调用约

《逆向工程权威指南》目录—导读

版权 逆向工程权威指南 • 著 [乌克兰] Dennis Yurichev 译 Archer 安天安全研究与应急处理中心 责任编辑 陈冀康 • 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 http://www.ptpress.com.cn • 读者服务热线:(010)81055410 反盗版热线:(010)81055315 版权声明 逆向工程权威指南 Simplified Chinese translation c

《Netty 权威指南》样章

声明:本文是<Netty 权威指南>的样章目录,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文. 第 2 章  NIO入门 在本章节,我们分别对JDK的BIO.NIO和JDK1.7最新提供的NIO2.0的使用进行详细说明,通过流程图和代码讲解,让大家体会到随着Java IO类库的不断发展和改进,基于Java的网络编程会变得越来越简单,随着异步IO功能的增强,基于Java NIO开发的网络服务器甚至不逊色于采用C++开发的网络程序. 本章主要内容包括:  传统的同步阻塞式IO编程

《逆向工程权威指南》—第3章3.5节MIPS

3.5 MIPS3.5.1 全局指针Global pointer全局指针是MIPS软件系统的一个重要概念.我们已经知道,每条MIPS指令都是32位的指令,所以单条指令无法容纳32位地址(指针).这种情况下MIPS就得传递一对指令才能使用一个完整的指针.在前文的例子中,GCC在生成文本字符串的地址时,就采用了类似的技术. 从另一方面来说,单条指令确实可以容纳一组由寄存器的符号.有符号的16位偏移量(有符号数).因此任何一条指令都可以构成的表达式,访问某个取值范围为"寄存器−32768"-

《逆向工程权威指南》—第3章3.4节ARM

3.4 ARM 根据我个人的经验,本书将通过以下几个主流的ARM编译器进行演示. 2013年6月版本的Keil编译器. Apple Xcode 4.6.3 IDE (含LLVM-GCC 4.2编译器) .[10] 面向 ARM64的GCC 4.9 (Linaro),其32位的Windows程序可由下述网址下载:http://www. linaro.org/ projects/armv8/. 除非特别标注,否则本书中的ARM程序都是32位ARM程序.在介绍64位的ARM程序时,本书会称其为ARM6

《逆向工程权威指南》—第2章2.2节ARM

2.2 ARMARM模式是什么情况? 指令清单2.3 Optimizing Keil 6/2013 (ARM模式) f PROC MOV r0,#0x7b ; 123 BX lr ENDP ARM程序使用R0寄存器传递函数返回值,所以指令把数值123赋值给R0. ARM程序使用LR寄存器(Link Register)存储函数结束之后的返回地址(RA/ Return Address).x86程序使用"栈"结构存储上述返回地址.可见,BX LR指令的作用是跳转到返回地址,即返回到调用者函数

《逆向工程权威指南》—第2章2.3节MIPS

2.3 MIPS在MIPS指令里,寄存器有两种命名方式.一种是以数字命名($0-$31),另一种则是以伪名称(pseudoname)命名($V0-VA0,依此类推).在GCC编译器生成的汇编指令中,寄存器都采用数字方式命名. 指令清单2.4 Optimizing GCC 4.4.5(汇编输出) j $31 li $2,123 # 0x7b 然而IDA则会显示寄存器的伪名称. 指令清单2.5 Optimizing GCC 4.4.5(IDA) jr $ra li $v0, 0x7B 根据伪名称和寄

《逆向工程权威指南》—第3章3.2节x86-64

**3.2 x86-643.2.1 MSVC-x86-64**若用64位MSVC编译上述程序,则会得到下述指令. 指令清单3.7 MSVC 2012 x64 $SG2989 DB 'hello, world', 00H main PROC sub rsp, 40 lea rcx, OFFSET FLAT:$SG2989 call printf xor eax, eax add rsp, 40 ret 0 main ENDP 在x86-64框架的CPU里,所有的物理寄存器都被扩展为64位寄存器.程