汇编之FS段寄存器】的更多相关文章

FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移  说明 000  指向SEH链指针 004  线程堆栈顶部 008  线程堆栈底部 00C  SubSystemTib 010  FiberData 014  ArbitraryUserPointer 018  FS段寄存器在内存中的镜像地址 020  进程PID 024  线程ID 02C  指向线程局部存储指针 030  PEB结构地址(进程结构) 034  上个错误号 得到KERNEL32.DLL基址的方法 assume fs:no…
8086汇编--Introduction 一.8086CPU的三种工作模式 实模式:只有低20位地址线起作用,仅能寻址第一个1MB的内存空间.MS DOS运行于该模式下. 保护模式:在该模式下,机器可提供虚拟存储的管理和多任务的管理机制.Windows 9x/NT/2000运行与该模式下. 虚拟8086模式:同时模拟多个8086处理器的工作. 二.8086微机系统的组成 对于汇编程序而言,我们需要关心CPU中的寄存器.存储器地址.端口(I/O地址). [内存单元的两个元素]: 地址(编号)和值(…
http://blog.csdn.net/michael2012zhao/article/details/5554023 一. 段寄存器的产生 段寄存器的产生源于Intel 8086 CPU体系结构中数据总线与地址总线的宽度不一致. 数据总线的宽度,也即是ALU(算数逻辑单元)的宽度,平常说一个CPU是“16位”或者“32位”指的就是这个.8086CPU的数据总线是16位. 地址总线的宽度不一定要与ALU的宽度相同.因为ALU的宽度是固定的,它受限于当时的工艺水平,当时只能制造出16位的ALU:…
http://www.cnblogs.com/tolimit/p/4775945.html?utm_source=tuicool&utm_medium=referral CPU的段寄存器 在CPU中,跟段有关的CPU寄存器一共有6个:cs,ss,ds,es,fs,gs,它们保存的是段选择符.而同时这六个寄存器每个都有一个对应的非编程寄存器,它们对应的非编程寄存器中保存的是段描述符.系统可以把同一个寄存器用于不同的目的,方法是先将其寄存器中的值保存到内存中,之后恢复.而在系统中最主要的是cs,ds…
转自:http://blog.sina.com.cn/s/blog_640531380100xa15.html 32位cpu 地址线扩展成了32位,这和数据线的宽度是一致的.因此,在32位机里其实并不需要采用"物理地址=段:偏移"这种地址表达方式.原来在16位机里规定的每一个段不大于64kb在32位机里也不是必要的.所以,对于32位机来讲,最简单的方法就是用一个32位数来标识一个字节的存储地址,寻址时只要给出一个32位数就可以直接找到地址.这种地址储存模型就属于"平展储存模型…
ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB…
eip寄存器存储着我们cpu要读取指令的地址,没有了它,cpu就无法读取下面的指令(通俗点讲cpu就无法执行.每次相应汇编指令执行完相应的eip值就会增加. 因为80386 cpu的寻址范围是4GB.所以它的寻址模式是平坦模式的.这里我描述下cpu通过读取eip寄存器执行的大致过程.. 此时我们假设一个程序开始执行了.首先PE loader装载我们的pe文件,读取我们pe文件的基地址和入口RVA地址(相对于基地址的偏移),并且读取相应节表结构的值,然后将我们的程序映射到内存. 此时,映射到内存以…
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向标志 中断允许标志 单步标志 符号标志 零标志 未使用 辅助标志 未使用 奇偶标志 未使用 进位标志 上表是 32 位寄存器 EFLAGS 的低 16 位. 不能直接读写 EFLAGS, 但有些方便的指令, 如:LAHF: 读取EFLAGS 低 8 位到 AH; SAHF 是 LAHF 的反向操作.…
状态寄存器访问过程:读 - 改 - 写 读 CPSR / SPSR 指令[ mrs ]    格式:<opcode><cond> Rn, cpsr/spsr 写 CPSR / SPSR 指令[ msr ]    格式:<opcode><cond> cpsr/spsr , Rn mrs r0, cpsr @ 读取cpsr 中状态放在 r0 中 mov r1, #0x1F mvn r1, r1 @ 按位取反在放到 r1 中 位 orr r0, r0, r1 @…
前言:   此文章收录在本人的<学习笔记分享>分类中,此分类记录本人的学习心得体会,现全部分享出来希望和大家共同交流学习成长.附上分类链接:   https://www.cnblogs.com/tibbors/category/1729804.html 学习内容:堆栈 堆栈的优点:临时存储大量数据,便于查找 堆栈中越往顶部地址编号越小 压栈出栈变的都是栈顶 堆栈的操作分解: 前提操作: MOV EBX,13FFDC //BASE MOV EDX,13FFDC //TOP 操作一:压入数据 法一…
汇编Shellcode的技巧 来源  https://www.4hou.com/technology/3893.html 本文参考来源于pentest 我们在上一篇提到要要自定义shellcode,不过由于这是个复杂的过程,我们只能专门写一篇了,本文,我们将会给大家介绍shellcode的基本概念,shellcode在编码器及解码器中的汇编以及几种绕过安全检测的解决方案,例如如何绕过微软的 EMET(一款用以减少软件漏洞被利用的安全软件).为了理解本文的内容,大家需要具了解x86汇编知识和基本文…
FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移  说明 000  指向SEH链指针 004  线程堆栈顶部 008  线程堆栈底部 00C  SubSystemTib 010  FiberData 014  ArbitraryUserPointer 018  FS段寄存器在内存中的镜像地址 020  进程PID 024  线程ID 02C  指向线程局部存储指针 030  PEB结构地址(进程结构) 034  上个错误号 在shellcode中用它来找KERNEL32.DLL基地址是常…
转自:https://yq.aliyun.com/articles/1723 摘要: 作者:王智通   CC_STACKPROTECT补丁是Tejun Heo在09年给主线kernel提交的一个用来防止内核堆栈溢出的补丁.默认的config是将这个选项关闭的,可以在编译内核的时候, 修改.config文件为CONFIG_CC_STACKPROTECTOR=y来启... 作者:王智通 CC_STACKPROTECT补丁是Tejun Heo在09年给主线kernel提交的一个用来防止内核堆栈溢出的补…
目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Handling.pdf . < DAY安全: 软件漏洞分析技术> 2. 数据结构分析 二. KTHREAD KTHREAD(内核层线程对象).再次重复说明一点: windows内核中的执行体(ETHREAD, EPROCESS) 负责各种与管理和策略相关的功能,而内核层(或微内核)(KTHREAD,…
随着64位操作系统的普及,都开始大力进军x64,X64下的调试机制也发生了改变,与x86相比,添加了许多自己的新特性,之前学习了Windows x64的调试机制,这里本着“拿来主义”的原则与大家分享. 本文属于译文,英文原文链接:http://www.codemachine.com/article_x64deepdive.html 翻译原文地址:深入Windows X64 调试 在正式开始这篇译文之前,译者先定义下面两个关于栈帧的翻译: frame pointer:栈帧寄存器.栈帧指针,在X86…
关于idt的基本知识就不进行赘述了,先看一个例子 0 ;------->进入内核,找到中断处理例程KiTrap03 0 这段代码执行,触发3号中断,然后开始执行KiTrap03例程,要知道,执行完中断以后还是要回到原来的程序处继续执行的,也就是我们这的Mov eax, 1的指令,显然,发生中断时的寄存器环境就要被保存,便于之后的恢复程序运行,这里,就出现了一个结构_KTRAP_FRAME,陷阱帧. kd> dt _KTRAP_FRAME nt!_KTRAP_FRAME +0x000 DbgEb…
一.前言   对于IDT第一次的认知是int 2e ,在系统调用的时候原来R3进入R0的方式就是通过int 2e自陷进入内核,然后进入KiSystemService函数,在根据系统服务调用号调用系统服务函数.而2e就是IDT(系统中断描述符表)中的索引位2e的项,而KiSystemService就是该项的例程函数,后来为了提升效率,有了系统快速调用,intel的的cpu通过sysenter指令快速进入内核,直接通过kiFastCallEntry函数调用系统服务函数,各种杀软也做了这个地方的Hoo…
KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 <寒江独钓>内核学习笔记(5)   继续我们的线程相关的数据结构的学习.接下来我们学习 KTHREAD,TEB这两个结构. 1. 相关阅读材料 1. <加密与解密3> 2. [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Handling.pdf 3. <0 DAY安全: 软件漏洞分析技术>…
1.LoadExe 接python版本 通过调用LoadExe去加载Dll进行注入 所以先看LoadExe 加载器的功能吧 通过python管道接收到  processID,ThreadID,路径 ,然后就开始搞事情了注入了 接收原理 管道具有传递命令行参数专递的作用,利用其进程间通信的功能,通过命令行传进来,不废话 开始了 先调用这几个函数 打开对方的进程,线程空间, 然后把加载Dll LoadLdrDll的函数地址,Dll路径写到对方进程空间 构建ShellCode 为什么要用汇编呢,应该你…
背景 我们在查core问题时,有时候须要查看某个TLS变量的值.可是GDB没有提供直接的命令,或者我不知道.这篇文字的目的.就是想办法从core文件里找出某个线程存放TLS变量的内容. 依据 Linux的glibc库创建线程时.使用mmap创建一块内存空间,作为此线程的栈空间.并将一个叫做struct pthread的数据结构放在栈的顶端(參考glibc代码allocate_stack@allocatestack.c).而TLS的数据结构就在struct pthread中: struct pth…
基于Linux 2.6.32内核进行分析,看本篇文章前,建议先看看percpu变量这篇文章 smp_processor_id()用来获取当前cpu的id,首先来看smp_processor_id的定义: # define smp_processor_id() raw_smp_processor_id() 接下来: #define raw_smp_processor_id() (percpu_read(cpu_number)) 有必要解释一下这里的cpu_number的由来: DEFINE_PER…
PEB TEB结构体使用一个可执行文件被OS加载到内存,并处理完成相关的模块加载,导入表处理……及其他必须处理后,形成一个进程.在OS内核中保存有一份关于这个进程的身份证信息,就是平常看到的HANDLE,叫进程句柄... OS完成加载后,FS段寄存器指向当前的TEB结构,具体TEB结构如下: kd> dt _tebnt!_TEB+0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIE…
| 本人只是原创翻译,而且翻译也不一定好,纯当锻炼.内容如果英文好的同学,建议直接去看英文原版,比较爽. NBAOL系列2代产品是 windows平台64位的应用程序,在技术测试过程中,遇到一些crash.但是通过生成的pdb文件却无法找到崩溃的地址.后来在网上看到了X64 Deep Dive这篇文章,觉得写得非常好,也解决了我的问题.这篇文章里面的知识点需要经常拿出来研究,本人英文不太好,每次看起来非常吃力,所以决定花点时间把这篇文章翻译下,以备需要用的时候拿出来看看,内容有错误的地方欢迎大家…
段选择器FS与TEB WinNT内核下内存采用保护模式,段寄存器的意义与实模式汇编下的意义不同.另外,FS存的是段选择子,而不是实模式下的高16位基地址. FS寄存器指向当前活动线程的TEB结构(线程结构) 下面为FS寄存器下偏移的相关信息: 偏移 说明 000h 指向SEH链指针 004h 线程堆栈顶部 008h 线程堆栈底部 00Ch SubSystemTib 010h FiberData 014h ArbitraryUserPointer 018h FS段寄存器在内存中的镜像地址 020h…
C/C++ 要实现程序反调试有多种方法,BeingDebugged,NtGlobalFlag,ProcessHeap,CheckRemoteDebuggerPresent,STARTUPINFO,IsDebuggerPresent,父进程检测,TLS 线程局部存储,RDTSC时钟检测反调试,MapFileAndCheckSum,等都可实现反调试,这里我分别编写了一些案例,基本上一锅端了. 使用WinDBG随便载入一个二进制文件,并加载调试符号链接文件. 0:000> .sympath srv*c…
  本篇原文为 X64 Deep Dive,如果有良好的英文基础的能力,可以点击该链接进行阅读.本文为我个人:寂静的羽夏(wingsummer) 中文翻译,非机翻,著作权归原作者所有.   由于原文十分冗长,也十分干货,采用机翻辅助,人工阅读比对修改的方式进行,如有翻译不得当的地方,欢迎批评指正.翻译不易,如有闲钱,欢迎支持.注意在转载文章时注意保留原文的作者链接,我(译者)的相关信息.话不多说,正文开始: 关于 X64 平台执行和调试关键方面的深度教程,例如编译器优化.异常处理.参数传递.堆栈…
前面分析完了copy_strings函数,这里来分析另一个注意的函数change_ldt. 先来看调用处: // 根据a_text 修改局部表中描述符基址和段限长,并将参数和环境空间页面放置在数据段末端. // 执行下面语句之后,p 此时是以数据段起始处为原点的偏移值,仍指向参数和环境空间数据开始处, // 也即转换成为堆栈的指针. p += change_ldt (ex.a_text, page) - MAX_ARG_PAGES * PAGE_SIZE; 解释的很清楚,也就是说p指向的是相当于…
从现在开始就是分析最后的核心模块exec.c了,分析完这个文件后,就会和之前的所有分析形成一个环路,从创建进程.加载进程程序到进程调度.内存管理. exec.c的核心do_execve函数很长,而且用到了很多其他的函数,copy_strings就是其中一个,我们这里就先来分析这个函数. 首先看调用处,在main.c中: static char *argv_rc[] = { "/bin/sh", NULL}; // 调用执行程序时参数的字符串数组. static char *envp_r…