首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《一个操作系统实现》笔记(1)--NASM汇编语法环境搭建

Ubuntu - 汇编编译器NASM - C编译GCC - 软盘绝对扇区读写工具dd - qemu虚拟机 - Bochs模拟器 - 磁盘映像工具bximage $ sudo apt-get...指针寄存器:SIDI,也可以像通用寄存器一样使用,但不能分割使用。 BPSP寄存器用来指向机器语言堆栈数据,被各自成为基址寄存器堆栈指针寄存器。...CS、DS、SS、ES寄存器是段寄存器。它们指出程序不同部分所使用内存。分别表示代码段、数据段、堆栈附加段。...在NASM中,任何不被方括号括起来标签或变量名都被认为是地址,访问标签中内容必须使用[ ]。 一个简单boot程序,开机后显示红色Hello,OS world!”...ntohl()函数执行一个相反交换。对于一个big endian系统,这两个函数仅仅是无修改地返回它们输入。这就允许你写出网络程序可以在任何Endian格式系统上成功编译运行。

3.9K52
您找到你想要的搜索结果了吗?
是的
没有找到

C语言 | C++ 基础栈溢出及保护机制

编译选项代码中有关数值可能需要根据实际情况略作修改。...第二个不同之处在于函数调用约定,x86-32位架构下函数调用一般通过栈来传递参数,而x86-64位架构下函数调用一般用rdi,rsi,rdx,rcx,r8r9寄存器依次保存前6个整数型参数,浮点型参数保存在寄存器...,rdi,rsi,rdx,r10,r9r8寄存器传递系统调用需要参数。.../hello-x64Hello world! 将编译生成可执行文件hello-x64,并在终端输出Hello world!。...(2) 栈保护机制 以gcc编译器为例,编译时若打开栈保护开关,则会在函数进入返回地方增加一些检测指令,这些指令作用是:当进入函数时,在栈上、ret rip之前保存一个只有操作系统知道数值;当函数返回时

4.5K88

如何进行Linux平台共享库替换

被替换函数特征分析 测试被替换函数hello()存在于SOlibfso.so中,程序main载入并以固定周期循环调用,其反汇编代码如图2所示。...图可知,方框标识代码为堆栈平衡函数返回指令,函数实际执行部分为地址hello+8至hello+60之间。...图 2测试被替换函数反汇编代码 替换函数编译再构造 测试替换函数汇编代码如图3所示,功能为输出Hello World!字符,其中方框标识空指令是为堆栈恢复函数返回指令预留存储空间。...x6c\x6f\x20\x77\x6f\x72\x6c\x64\x21\x0a 【修改Shellcode】 利用GDB调试被替换程序,得到动态库中函数堆栈恢复函数返回代码。...4 改成 8;三是user_regs_struct结构体指令寄存器 eip 改成 rip;四是shellcode修改适用于x86_64平台。

2.8K80

MIPS漏洞调试环境安装-栈溢出

可以编译Linux内核一样,通过buildroot配置,menuconfig修改编译出一个完整可以直接烧写到机器上运行Linux系统软件(包含boot、kernel、rootfs以及rootfs...1; } vul(argv[1]); return 0;} 静态编译生成二进制文件mips-linux-gcc -o hello hello.c -static,使用file查看文件类型,可以看到生成了...MIPS32架构函数调用时对堆栈分配使用方式与x86架构有相似之处,但又有很大区别。区别具体体现在: · 栈操作:与x86架构一样,都是向低地址增长。...· 返回地址:在x86架构中,使用call命令调用函数时,会先将当前执行位置压入堆栈,MIPS调用指令把函数返回地址直接存入$RA寄存器而不是堆栈中。...mipsel-linux-gcc -static stack_vuln.c -o stack_vuln 将编译生成程序拖到IDA里面查看,确定输入字符串长度为多少时可以覆盖到$ra,可以得到: offset

1.7K50

通过反汇编理解函数调用机制(x86ARM)

("%d",result); 13 } 执行反汇编指令:gcc -g test.c objdump -S 得到x86机器汇编代码(除去一些初始化代码)如下: ?...在分析上面的汇编程序之前,需要了解rbp、rsp为栈基址寄存器、栈顶寄存器,分别指向栈底栈顶;edx、eax、esi、edi均为x86CPU上通用寄存器,可以存放数据(虽然它们还有别的作用,但是本文章不涉及...对上面汇编代码分析: 进入main函数,保护现场,将rbp压入堆栈; 然后为main函数开拓新堆栈框架,rbp与当前rsp相同,rsp再向上扩充16个字节(0x10);(以前C程序只能在函数前面声明变量...,是因为编译器还么有那么“智能”,它只能通过分析前部分变量,一次性程序扩充堆栈) 然后向栈底上方偏移地址为812单元存入数据12; 把数据送入通用寄存器中,以供新函数调用; 跳转到add...ARM为堆栈提供硬件支持,它有一个专门寄存器sp指向栈顶,ARM支持四种堆栈工作方式,最常用也是x86类似,即从高地址向低地址生长。

1.8K20

逆向工程——栈

操作栈最常见指令是PUSHPOP,在 x86 ARM Thumb 模式指令里都有这两条指令。...ARM ARM程序也使用栈保存返回地址,只是略有不同。之前课程中我们看到“hello world程序返回地址保存在LR寄存器里。...但是如果程序还会继续调用其它函数,就需要在调用函数之前保存LR寄存器里面的值。通常函数会在启动过程中(序言处)保存LR寄存器值。...函数尾声代码还会还原ESP值,把数据栈还原为函数启动之前状态,直接抛弃alloca()函数分配内存,所以程序不需要特地使用free函数来释放这个函数申请内存。...GCC Intel语体 在编译上述代码时,GCC 4.4.1 同样不会调用外部函数 指令清单 5.2 GCC 4.7.3 .LC0: .string "hi!

83031

分析Linux系统执行过程

为什么execve系统调用返回后新可执行程序能顺利执行?对于静态链接可执行程序动态链接可执行程序execve系统调用返回时会有什么不同?...\n"); } } 将程序保存为test_fork.c文件,并修改 Makefile 文件,重新编译 MenuOS。...文件包含进来及宏替换等工作) $ gcc -E -o test.cpp test.c -m32 第三步:编译成汇编代码hello.s $ gcc -x cpp-output -S -o test.s...test.cpp -m32 第四步:编译成目标代码,得到二进制文件hello.o $ gcc -x assembler -c test.s -o test.o -m32 第五步:链接成可执行文件hello...为什么execve系统调用返回后新可执行程序能顺利执行?对于静态链接可执行程序动态链接可执行程序execve系统调用返回时会有什么不同?

88520

c语言基础学习02_helloworld

}大括号用法解释、C语言自定义名字要求、 c语言库函数printf解释、编译错误有两种、调用system函数、c语言编译过程、 操作系统结构、指令集中cpu架构 、QT常用快捷键、vs常用快捷键....c -c 或者 gcc -o cc1.o -c cc1.c 或者 gcc -c cc1.c -o cc1.o 编译cc1.c编译之后得到文件名字叫cc1.o....或者 gcc cc1.o -o c1(注意:gcc没有单独链接参数) 将系统库函数与cc1.o进行链接(简言之合并),得到可执行程序,该程序名字叫c1。...复杂指令CISC(比如InterCPU)比如:X86属于典型复杂指令。...cpu内部寄存器还有名字哦: 8位cpu(x86构架)    16位CPU   32位CPU   64位CPU a           ax,al,ah      eax

67620

int 3中断与软件调试

下面,我们来测试一个程序:   1 #include2 #include3 #include4 5 int main()6 {7 printf("hello world");8 __asm__...("int $0x03");9 printf("hello world");10 return 0;11 }  编译gcc hello.c -o hello    调试:gdb hello   .../breakpoint trap. main () at hello.c:99 printf("hello world");    可以看到,即使我们不在调试器中设置断点,也能正常中断    ...在跳转到处理例程之前,CPU会保存当前执行上下文,包括段寄存器程序指针寄存器等内容。          ...7.为什么看不到调试期写入int 3指令      因为,调试器总是“执行到b line,替换为int 3指令,调用中断,恢复int 3之前指令,将现场返回给用户”,所以,int 写入但是又被置换

2.2K20

Win32汇编:汇编基本知识总结

,就将X86指令X87指令统称为X86指令.虽然随着CPU技术不断发展,Intel公司陆续研制出更新型i80386、i80486、Pentium直到今天,但为了保证电脑能继续运行以往开发各类应用程序以保护继承丰富软件资源...CPU,但对于编译设计有更高要求.总结:当精简指令出现后,所有人都说复杂指令已经过时,英特尔密切关注,为了谨慎.英特尔同时开发复杂指令CPU精简指令CPU.精简指令处理器上市后,复杂指令...),主要用于存放堆栈内存储单元偏移量,它们主要用于访问堆栈存储单元并且规定,EBP为基址指针寄存器,ESP为堆栈指针寄存器,指针寄存器不可分割成8位寄存器,该寄存器默认SS堆栈寄存器相关联.指令指针寄存器...不可手动修改,一般都是特殊指令CALL,RET,PUSH等间接性修改.段寄存器: 段寄存器是根据内存分段管理模式而设置,内存单元物理地址寄存器一个偏移量组合而成,这样可用两个较少位数值组合成一个可访问较大物理空间内存地址...,常规段寄存器包括CS:代码段寄存器,DS:数据段寄存器,SS:堆栈寄存器,ES:附加数据段寄存器这些寄存器通常是编译器或这是操作系统来维护.标志寄存器: 标志寄存器(EFLAGS),该寄存器用来控制

1K20

linux内核1-GNU汇编入门_X86-64&ARM

比如,运行gcc -S hello.c -o hello.s编译命令,编译hello程序: #include int main( int argc, char *argv[] )...{ printf("hello %s\n","world"); return 0; } 可以在hello.s文件中看到如下类似的输出: .file "test.c" .data .LC0...汇编代码编译成可执行文件,可以参考下面的代码编译示例: % gcc hello.s -o hello % ..../hello hello world 把汇编代码生成目标文件,然后可以使用nm工具显示代码中符号,参考下面的内容: % gcc hello.s -c -o hello.o % nm hello.o...这两个寄存器保存着比较运算结果,以及与进程状态相关特权数据。用户态程序不能直接访问,但是可以通过一些操作副作用修改它们。 ARM使用下面的后缀表示数据大小。它们与X86架构不同!

4.5K20

Win32汇编:汇编基本知识总结

指令,同时电脑中为提高浮点数据处理能力而增加X87芯片系列协处理器则另外使用X87指令,为了提高处理器性能,就将X86指令X87指令统称为X86指令....公司所生产所有CPU仍然继续使用X86指令,所以它CPU仍属于X86系列,由于X86系列及其兼容CPU都使用X86指令,所以就形成了今天庞大X86系列及兼容CPU阵容....堆栈指针寄存器: CPU内部有2个通用寄存器EBPESP,寄存器EBP、ESP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元偏移量,它们主要用于访问堆栈存储单元并且规定...,默认情况下EIP不可手动修改,一般都是特殊指令CALL,RET,PUSH等间接性修改....,DS:数据段寄存器,SS:堆栈寄存器,ES:附加数据段寄存器这些寄存器通常是编译器或这是操作系统来维护.

81910

GCC、ARM-LINUX-GCC、ARM-ELF-GCC浅析

大家好,又见面了,我是全栈君 一、GCC简介: The GNU Compiler Collection,通常简称GCC,是一套GNU开发编译为什么是编辑器而不是编译器呢?...因为不同目标机指令是不一样,比如arm跟x86就不一样】 2. gcc-core:顾明之意是GCC核心部分,这部分是只包含c编译器及公共部分,而对其他语言【C++、Ada等】支持包需要另外安装...GCC一般工具通常都是通过在命令行上调用命令(如gcc)来执行。在使用交叉编译情况下,这些工具将根据它编译目标而命名。...例如,要使用交叉工具链为ARM机器编译简单Hello World程序,你可以运行如下所示命令: 使用如下命令编译并测试这个代码: $ arm-linux-gcc -o hello hello.c 五...gcc-g++2.95.3.tar.gz,这个压缩包就是为使GCC能够编译C++程序而单独发布

6.5K10

为什么 Linux 系统调用会消耗较多资源

stdio.h> int main() { printf("Hello, World!")...; return 0; } $ gcc hello.c -o hello $ strace ./hello execve("./hello", ["....执行 Hello World 程序时触发多数系统调用都是程序启动触发,只有 munmap 后系统调用才是 printf 函数触发,作为应用程序我们能做事情非常有限,很多功能都需要依赖操作系统提供服务...eax 寄存器中; 从内核栈中恢复寄存器值并将返回值放到栈上; 系统调用会返回 C 函数,包装函数会将结果返回给应用程序; 如果系统调用服务在执行过程中出现了错误,C 语言函数会将错误存储在全局变量...虽然程序系统调用非常频繁,但是与普通函数调用相比,它会带来明显地额外开销: 使用软件中断触发系统调用需要保存堆栈返回地址等信息,还要在中断描述表中查找系统调用响应函数,虽然多数操作系统不会使用

1.8K40

CC++:堆栈面面观

这时x86系统设计师们,巧妙地将栈起始位置定于内存空间另一端,而其地址增长方式也是堆相反从高到低,这样从一定程度上,减轻了堆栈内存地址冲突或栈空间不足可能性。...比如:gcc -S -masm=intel hello.c 这时就会生成汇编文件hello.s。...推荐一篇文章《X86-64寄存器栈帧》 说个题外话,上面我代码如果开了优化会怎么样呢?用gcc -S -masm=intel -O 来编译一下看看。...如果一个程序引用了静态库,那么在编译期静态库文件就会程序编译到一起。...这样编译出来可执行文件通常比较大,并且如果多个程序都使用了同一个静态库,那么每个程序编译文件都包含一份该静态库拷贝;而如果一个程序引用了共享库,那么在编译期共享库文件不会程序编译到一起,而是在程序运行时动态地加载该共享库文件

43920

X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言比较、gcc 嵌入式汇编

此书已经开源,阅读地址 http://www.kerneltravel.net 注解:不同平台有不同instruction set 即指令,比如x86, PowerPC, ARM等平台指令是不同...如果要使用GNC C 编译gcc,就可以一步完成汇编连接,例如: gcc -o example example.S 这里,example.S 是你汇编程序,输出文件(可执行文件)名为example...其中,扩展名必须为大写S,这是因为,大写S 可以使gcc 自动识别汇编程序C 预处理命令,像#include、#define、#ifdef、#endif 等,也就是说,使用gcc 进行编译,你可以在汇编程序中使用...section .data:这种节包含程序已初始化数据,也就是说,包含具有初值那些变量,例如: hello: .string "Hello world!...指令中有几个操作数,就说明有几个变量需要与寄存器结合,gcc编译时根据后面输出部分输入部分约束条件进行相应处理。

3K00

编译器入门

Hello, Compiler 下面是一个简单 C 程序,它只是向标准输出打印出 “Hello, Compiler!”。虽然人类可以读懂 C 语言语法,但是机器并不认识它。...我将通过三个编译步骤,使得机器能够执行这个程序。 // compile_me.c // Wave to the compiler. The world can wait....C 预处理器 在翻译成 IR 之前对源代码进行修改。预处理器会将外部文件包含进来,比如上面的#include 。...我 CPU 是 x86 架构,也就是说只能使用 16 个寄存器。但是,编译器会选择尽可能少地使用寄存器。...这个程序x86 汇编语言,它是目标机器能够读懂语言一个“人类表示”。目标机器只能读懂 0 1,汇编语言是将 0 1 代码用人类能够读懂方式表达了出来。相信肯定会有人懂:).

1.7K10
领券