就连这四个分别叫做%eax,%ebx,%ecx,%edx的寄存器,尽管看似是随意按照abcd的字母排序的,其实这a,b,c,d也分别是四个单词的缩写。 %——百分号表示这是一个寄存器。...因为以前的intel寄存器都是16位的,它们的名字就是%ax,%bx等等,所以扩展到32位之后就在开头加上一个e,改名叫%eax,%ebx等 1....EAX - Accumulator Register(累加器) 当你写一个函数,最后返回一个值x(return x),那么这个x就要被存到%eax....当你要把一个数字扩展成64位,那么%eax存这个数的低32位,%edx存这个数的高32位。 2....(当你要把一个数字扩展成64位,那么%eax存这个数的低32位,%edx存这个数的高32位。) 后面四个,大家可以看文章开头的资料,我就懒得翻译了。 5.
#### int 0x80 --linux 系统调用入口点(调用中断int 0x80,eax 中是调用号)。...call _sys_call_table(,%eax,4) pushl %eax # 把系统调用号入栈。 movl _current,%eax # 取当前任务(进程)数据结构地址??...sys_call_table(,%eax,4) ,执行完一系列的保护现场措施后,程序将根据(_sys_call_table的初始地址)+4*%eax 进行跳转执行,%eax就是我们的系统调用中断号。.../include/linux/sched.h \ ../include/linux/head.h ../include/linux/fs.h ...../include/linux/sched.h \ ../include/linux/head.h ../include/linux/fs.h ..
二、进入系统调用 本文主要介绍的是 x86 CPU 进入系统调用的方式 Linux 提供了 int 0x80 中断来让用户程序进入 系统调用,我们来看看 Linux 对 int 0x80 中断的处理初始化过程...call *SYMBOL_NAME(sys_call_table)(,%eax,4) movl %eax,EAX(%esp) # save the return value .....system_call 过程获取 eax 寄存器的值,然后通过 eax 寄存器的值找到要调用的 系统调用 入口,并且进行调用。调用完成后,系统调用 会把返回值保存到 eax 寄存器中。...Linux 使用寄存器来传递参数,参数与寄存器的关系如下: 第1个参数放置在 ebx 寄存器。 第2个参数放置在 ecx 寄存器。 第3个参数放置在 edx 寄存器。...而 Linux 进入中断处理程序时,会把这些寄存器的值保存到内核栈中,这样 系统调用 就能通过内核栈来获取到参数。
转自陈莉君一书《深入分析Linux内核源码》http://www.kerneltravel.ne运维 转自 陈莉君 一书《深入分析Linux内核源码...》 http://www.kerneltravel.net/kernel-book/第二章%20Linux运行的硬件基础/2.6.1.htm 2.6.1 AT&T与Intel汇编语言的比较 我们知道...,Linux是Unix家族的一员,尽管Linux的历史不长,但与其相关的很多事情都发源于Unix。...就Linux所使用的386汇编语言而言,它也是起源于Unix。Unix最初是为PDP-11开发的,曾先后被移植到VAX及68000系列的处理器上,这些处理器上的汇编语言都采用的是AT&T的指令格式。...eax,[ebx+ecx] Leal (%ebx,%ecx),%eax sub eax,[ebx+ecx*4h-20h] Subl -0x20(%ebx,%ecx,0x4),%eax
的内容 mov edx,len ;msg的长度 int 0x80 ;write(1,msg,len) mov eax...这部分内容可参考【Linux编程】中的一篇文章--《Linux架构》:https://mp.weixin.qq.com/s/xpCLPfotCqWZ_PDagK0ERA 这是一张Linux的架构图: ?...32位Linux系统调用号: /usr/include/x86_64-linux-gnu/asm/unistd_32.h 64位Linux系统调用号: /usr/include/x86_64-linux-gnu...以下为linux0.11内核源代码中于kernel/sched.c里面的内容: ?...linux0.11内核源代码(https://github.com/loveveryday/linux0.11/blob/master/kernel/sched.c) 系统调用和系统中断的组合-汇编程序的实现
目标代码如下(linux/boot/head.s): 17:startup_32: 18: movl $0x10,%eax ...... 48: call check_x87 49:...目标代码如下(linux/init/main.c): void main(void){ ..........目标代码(linux/kernel/sys_call.s): _system_call: cmpl $nr_system_calls-1,%eax # 调用号如果超出范围的话就在eax 中置-1 并退出...call _sys_call_table(,%eax,4) pushl %eax # 把系统调用号入栈。 movl _current,%eax # 取当前任务(进程)数据结构地址??...l: ret 首先调用find-empty-process函数,具体代码不再阐述了,可以翻看linux内核剖析。
动态调试elf文件的几种方法 最近在刷题的时候遇到了很多elf文件,虽然可以通过ida分析伪代码解出来,但是发现有些通过动态调试的方式可以直接找到flag,这样简单了不少,因为之前接触的linux下的逆向题目比较少...0x01 ida动态调试 ida不光可以静态分析函数伪代码,也可以通过动态调试的方式来分析linux下的elf文件。...首先将ida/dbgsrv/路径下的linux_server/linux_serverx64文件复制到linux下,两个文件分别是调试32位和64位程序使用的: 在linux下启动对应的文件: 把我们要调试的文件放到相应的文件夹中...在ida中选择Debugger-Run-Remote linux debugger 在弹出的对话框中,Application填写文件存放的位置和文件名,Directory中填写文件存放的路径,Parameters...是指传递的参数,如果程序运行需要传参的话可以在这填入,Hostname就是linux的ip地址,Port一般都是默认的23946,如果设置了password在下方填入,没有就空着: 进入ida动态调试界面
2015-04-05 之前代码参考地址:《Linux内核分析》之触发一个系统调用实验总结 代码与分析 跟踪截图 多图预警,由于跟踪失败,感觉仅可做个动过手的见证,但可看性不高,可以略过,具体的看个人了。...主要代码段 xref: /linux-3.18.6/arch/x86/kernel/entry_32.S的490行起(持续更新中-2014-4-7) # system call handler stub...jae syscall_badsys syscall_call: call *sys_call_table(,%eax,4) syscall_after_call: movl %eax,PT_EAX...自动跳转到system_call这个位置来执行 系统调用机制一旦在start_kernel初始化好之后,即在代码中一旦出现int$0x80的指令立即跳转到system_call这个位置,其位置在xref: /linux...windCoder原创作品转载请注明出处 参考资料 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。...二、Linux 汇编语法格式 绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。...AT&T 格式Intel 格式 movl -4(%ebp), %eaxmov eax, [ebp - 4] movl array(, %eax, 4), %eaxmov eax, [eax*4 +...array] movw array(%ebx, %eax, 4), %cxmov cx, [ebx + 4*eax + array] movb $4, %fs:(%eax)mov fs:eax, 4...,那我们也以这种方式来开始介绍 Linux 下的汇编语言程序设计。 在 Linux 操作系统中,你有很多办法可以实现在屏幕上显示一个字符串,但最简洁的方式是使用 Linux 内核提供的系统调用。
2 《Linux操作系统原理与应用》解释: 陈莉君老师的《Linux操作系统原理与应用(第二版)》对Linux系统调用解释为: 系统调用的实质就是函数调用,只是调用的函数是系统函数,处于内核态而已...call *sys_call_table(,%eax,4):根据EAX中的系统调用号调用对应的服务程序。 (3)退出系统调用: movl %eax, PT_EAX(%esp):保存返回值。...由于是32位即每个sys_call_table是4个字节,如果是64位则程序语句为call *sys_call_table(, %eax, 8) 在linux-2.6.39内核源码中: 32位下系统调用表在...执行下列命令: $ ldd /bin/uname linux-vdso.so.1 => (0x00007ffcb75de000) libc.so.6 => /lib/x86_64-linux-gnu/...- ld-linux-x86-64.so.2:程序解释器(链接器)。
马马虎虎学完了Python课程,一直想学下linux,看到里面有个linux的就选上了。...此处以32为例 cup对内存的操作方法 mov指令 常用mov寻址命令 movl %eax,%edx edx =eax; 解释:register mode 寄存器寻址 本句含义:将eax寄存器里的内容放到... 将 寄存器%eax压栈到栈顶,栈的位置在增长 what it does subl $4,%esp 压栈 esp-4,将堆栈的栈顶 movl %eax,(%esp) 间接寻址将eax放置到esp...2、对x86计算机大多数的指令可直接访问一个内存地址 AT&T汇编格式与Intel汇编格式略有不同 Linux内核使用的是AT&T汇编格式 windCoder原创作品转载请注明出处 参考资料 本文部分资料与图片参考自...《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
大家好,又见面了,我是全栈君 在很多人的眼里,C语言和linux常常是分不开的。这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品。...当然,linux操作系统本身对C语言的支持也是相当到位的。...作为一个真正的程序员来说,如果没有在linux下面用C语言编写过完整的程序,那么只能说他对C语言本身的理解还相关肤浅,对系统本身的认识也不够到位。...如果还没有过Linux编程经验的朋友可以首先在自己的pc上面安装一个虚拟机,然后就可以在shell下面编写自己的C语言代码了。...如果你看到了,那么恭喜你,你已经可以开始linux的c语言编程之旅了。 当然,我们不会满足于这么简单的打印功能。
最近看到Linux Kernel cmpxchg的代码,对实现很不理解。上网查了内嵌汇编以及Intel开发文档,才慢慢理解了,记录下来以享和我一样困惑的开发者。...好了,让我们来看Linux Kernel中的cmpxchg(网上找来的,我自己机器上没找到对应的头文件,据说在include/asm-i386/cmpxchg.h)实现: 01./* TODO: You..."=a"是说要把结果写到__ret中,而且要使用eax寄存器,所以最后写结果的时候是的操作是mov eax, ret (eax==>__ret)。"...在cmpxchg中,就是说_old和__ret使用一样的寄存器,而__ret使用的寄存器是eax,所以_old也用eax。...翻译一下: 比较eax和目的操作数(第一个操作数)的值,如果相同,ZF标志被设置,同时源操作数(第二个操作)的值被写到目的操作数,否则,清ZF标志,并且把目的操作数的值写回eax。
我这里贴一段小小的汇编代码 如果你能不看下面的我的解释 明白这段代码的大概要做的操作 那么恭喜你,你已经熟练掌握基础的汇编指令了 mov ecx, dword ptr [eax+8Ch] add eax..., 88h mov edx, dword ptr [eax] mov dword ptr [ecx], edx 第三行呢把eax所指向的那个地址上的数据取出来 赋给了edx,最后把edx的值赋到了ecx...尤其是在代码量极大的时候 把汇编转换成等价的C语言代码,是会节省我们很多的分析时间的(不要跟我说有插件) 如果你能独立完成汇编到C语言代码的转换,那么说明第二点你也是合格的了~ 比如刚刚那段代码,我们转换一下看看(我喜欢用Linux...+ 140); // 88h = 136d eax = eax + 136; edx = *eax; *ecx = edx; // Not list return...要了解基本的Win32编程和Linux编程 比如恶意代码调用了哪个库,不需要记住每个Windows的API,但是你要知道哪里去查 比如Windows呢就是MSDN 如果是Linux呢,就是man 当然,
分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己独立的内存空间) 线程在Linux中的实现 《Linux内核设计与实现》第三版28页 线程在Linux就是一个普通的进程...进程 Linux中也称为task,是系统分配资源的基本单位 资源包括:独立的地址空间,内核数据结构(进程描述符…),全局变量, 数据段… Linux进程描述符:PCB (Process Control...中是1457号线程) 调度策略 早期Linux 2.5 内核用的是Unix O(1)调度策略,按固定的时间片给程序 Linux内核2.6.23 采用CFS调度策略:Completely Fair Scheduler...;系统调用sys_exit movl $0, %ebx int $0x80 系统调用是通过int 0x80来实现的,eax寄存器中为调用的功能号,ebx、ecx、edx...第二个int0x80之前eax为1表示调用exit,ebx为0表示传入参数0。
对于4G的地址空间,每个页大小是4K,模仿Linux早期的做法,32位地址的前10位为页目录项,中间10位为页表,后面10位为偏移量。...备注: 我们模仿Linux,0-3G是用户空间,3G-4G是内核空间,又因为咱们写死了内核加载到物理地址1M以内,所以将0xc0000000 映射到物理地址的0-4M上 第一个页表也映射到0-4M这个空间..., PAGE_DIR_TABLE_POS add eax, 0x1000 ; 此时eax为第一个页表的位置及属性 mov ebx, eax ; 此处为ebx赋值...mov [PAGE_DIR_TABLE_POS + 0x0], eax ; ;第1个目录项,在页目录表中的第1个目录项写入第一个页表的位置(0x101000)及属性(7) mov...sub eax, 0x1000 mov [PAGE_DIR_TABLE_POS + 4092], eax ; 使最后一个目录项指向页目录表自己的地址
[xuzhina@localhost s1_ex]$ gdb xuzhina_dump_c07_s1_ex core.27776 GNU gdb (GDB) Red Hat Enterprise Linux...This GDB was configured as "i686-redhat-linux-gnu"....Loaded symbols for /lib/libc.so.6 Reading symbols from /lib/ld-linux.so.2......Loaded symbols for /lib/ld-linux.so.2 Core was generated by `./xuzhina_dump_c07_s1_ex'....> 0x08048aad : mov (%eax),%eax 0x08048aaf : cmp %eax,%ebx 0x08048ab1 :
我觉得很庆幸,在 Linux 下和 MacOS 下(MacOS 本身就是 BSD 发展而来)写 C 语言的代码和 Windows 下都差不多,所以最近偶尔会看看关于 Linux 下的 C...mov [rbp-10h], eax...mov [rbp-14h], eax...mov eax, [rbp-0ch]...xor eax, eax
GCC内嵌汇编语言 作者:肖文鹏 临江仙 整理:杨小华 绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。...但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同。...AT&T 格式 Intel 格式 section:disp(base, index, scale) section:[base + index*scale + disp] 由于 Linux...mov eax, [ebp - 4] movl array(, %eax, 4), %eax mov eax, [eax*4 + array] movw array(%ebx,...其实很简单:因为GCC 知道eax 已经被使用,它在这段汇编代码的起始处插入一条语句pushl %eax,将eax 内容保存到堆栈,然后在这段代码结束处再增加一条语句popl %eax,恢复eax的内容
主要还是要理解系统调用的原理: 系统调用 既然是执行系统调用,在这里就大概记录一下Linux系统下的系统调用,Linux的系统调用通过int 80h来实现,用系统调用号来区分入口函数,...) 系统调用完成相应功能,将返回值存入 EAX,返回到中断处理函数 中断处理函数返回到 API 中 PI 将 EAX 返回给应用程序 应用程序调用系统调用的过程是: 把系统调用的编号存入 EAX 把函数参数存入其它通用寄存器...最后 int 0x80 寄存器: 寄存器执行顺序 32位 eax->ebx->ecx->edx 64位 rdi->rsi->rdx->rcx->r8->r9 32位执行时 eax的参数为系统调用号...调用的过程就是在内存地址中读取之后用户输入/bin/sh先找到eax,ebx,ecx,edx以及int 0x80的地址 eax参数为read()函数系统调用号0x3,在edx,ecx,ebx传入相对应的...sleep(1) sh.recvuntil('Nh..') bin_sh = "/bin/sh\x00" sh.sendline(bin_sh) sh.interactive() ret2sys_64 linux
领取专属 10元无门槛券
手把手带您无忧上云