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

为什么ModR/M:rm字段是100,字节ptr [rbx + rsi*2 + 0x100]?

ModR/M:rm字段是100,字节ptr rbx + rsi*2 + 0x100的含义是根据ModR/M字节中的rm字段的值来确定内存操作数的寻址方式。在这个特定的情况下,rm字段的值为100,表示使用基址寄存器rbx和变址寄存器rsi进行寻址,并且乘以2后加上偏移量0x100。

具体解释如下:

  • ModR/M字节是指用于指令中的一个字节,用于确定指令的操作数类型和寻址方式。
  • rm字段是ModR/M字节的最后3位,用于指示寻址方式。
  • 在这个情况下,rm字段的值为100,表示使用基址寄存器rbx和变址寄存器rsi进行寻址。
  • 乘以2后加上偏移量0x100,表示通过将变址寄存器rsi的值乘以2,然后加上0x100来计算内存地址。

这种寻址方式的优势是可以根据基址寄存器和变址寄存器的值来动态计算内存地址,灵活性较高。这种寻址方式常用于数组、矩阵等数据结构的访问和操作。

腾讯云提供了一系列云计算相关的产品,其中与内存操作和寻址方式相关的产品包括云服务器(ECS)、云数据库(CDB)、云存储(COS)等。您可以通过访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于这些产品的详细信息和使用指南。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • ROP攻击缓解新思路——减少ROP Gadgets的数量

    ,也是最容易用在Gadget上的 从两方面减少polymorphic gadgets 1、寄存器的选择 2、代码的生成 寄存器的选择 常见的带c3结尾的gadgets,ret前面的汇编指令的ModR/M...字节(汇编指令中,Opcode之后就是ModR/M)经常使用的寄存器如下:(这里说的比如常见的汇编:mov ebx,eax) 源寄存器使用RAX/EAX/AX/AL 目的寄存器使用RBX/EBX/BX/...按此顺序分配寄存器:RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11, RBX, R14, R15, R12, R13, RBP 可以将RBX寄存器几乎挪到最后:RAX..., RCX, RDX, RSI, RDI, R8, R9, R10, R11, R14, R15, R12, R13, RBX, RBP 当然ebx的顺序也是要改变的 这样,性能的损耗为0,代码的字节可以忽略不计.../M, SIB或者特殊的指令 2、还有就是常量包含了return字节 我们可以实现相同的功能,但是不使用rerun字节或者要求强制对齐 对于ModR/M, SIB会出现return字节的如下 减少的方法就是

    6210

    从hook的并发症理解x64指令格式

    指令格式概述 指令包括可选的指令前缀 (in any order),主要操作码字节 (up to three bytes),由ModR / M字节以及有时由SIB(Scale-Index-Base)组成的寻址形式说明符...,操作数可以是立即数、寄存器、内存地址,或者是几种操作数的组合,ModR/M and SIB Bytes 表示的是 寻址模式标识字节,不是特别好理解,通过一个例子看一下: 40c27a:...[image] 某些特定的ModR/M字节需要一个后续字节,称为SIB字节。32位指令的基地址+偏移量,以及 比例*偏移量 的形式的寻址方式需要SIB字节。...ModR/M 字段从 REX的字段上 扩展了 1 bit, 如果用64位的寄存器,查表如下: [image] 查询的表格见: https://wiki.osdev.org/X86-64_Instruction_Encoding...在64位模式下,使用ModR / M寻址的指令可以使用RIP相对寻址。如果没有RIP相对寻址,则所有ModR / M模式都会相对于零寻址存储器。

    1.6K90

    逆向初级-硬编码(六)

    2、当Mod = 00时,ModR/M字节通过寄存器直接进行内存寻址 例如当操作指令为88 01时,其对应的汇编为MOV BYTE PTR DS:[ECX], AL 88 是操作指令,其后跟随的01为ModR...举例说明:80 65 08 FF 1.第一个字节为80 查Table-2表,得到对应结构:Eb,Ib 2.第二个字节为ModR/M字段,所以拆分65: ​ 01 100 101 Mod 与 R/M...6.6.经典变长指令_SIB字段 ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX + ECX*2 + 12345678]时,仅仅靠ModR/M字段,是描述不出来的。...这时就在ModR/M后面增加一个SIB字节,与ModR/M字段共同描述。 下图是上两节没有涉及到的三种情况 ? 这三种情况表示,在ModR/M字节后,还紧跟着一个SIB字节。...2.第二个字节为ModR/M字段,所以拆分84: ​ 01 000 010 ?

    90521

    【连载】两百行Rust代码解析绿色线程原理(五)附录:支持 Windows

    你可能想知道为什么我没有在原始代码中包含此内容,其原因是,这实际上与解释我想探索的主要概念没有任何关系。 在这里,我试图进一步探讨如何为 Windows 正确设置栈并进行适当的上下文切换。...: u64, rbp: u64, rdi: u64, rsi: u64, xmm6: [u64; 2], xmm7: [u64; 2], xmm8: [u64...使用对齐指令,是指它们读写的内存是 16 字节对齐的。 现在,我解决此问题的方法是将需要对齐的字段推送到结构的开头,并添加新属性 #[repr(align(16))]。...#[repr(align(16))] 属性确保我们的结构以 16 字节对齐的内存地址开始,因此当我们在汇编代码一开始写 XMM6 寄存器时,它已经是 16 字节对齐的,并且由于 128 被 16 整除,..., r14: u64, r13: u64, r12: u64, rbx: u64, rbp: u64, rdi: u64, rsi: u64,

    66920

    CSAPP-Bomb-Lab

    注意:我们输入的第一个数字在rsp中,而整数占4个字节,也就是说rsp+0x4的位置存放的正是我们输入的第二个数字,请记住这一点,在后面的分析中非常重要 对Phase_2的分析 我们关注一下这四句话...而再看我们前面对于Phase_2 的分析,可以发现,rbx里的值是rsp+0x4处的值,也就是说rbx里的值为我们输入的第二个值,那么rbx-0x4存的就是我们输入的第一个值。...rbx=rbx+0x4,既现在rbx里的值,是我们输入的第三个值,然后进行了一个比较以后,若没通过则回到Phase_2的位置,那么可以看出,这是一个循环,这个循环的作用是确保后一个输入的值为前一个输入乘以...0x0000000000400f88 : jmp 0x400fbe 0x0000000000400f8a : mov eax,0x100...此处为什么并不是直接到0x402470呢? 因为在汇编语言中,中括号[]表示的是取括号里地址的值!

    2K20

    X86指令格式(操作码列和指令列解释)

    digit  为0到7之间的数字,表示指令的 ModR/M byte 只使用 r/m字段作为操作数,而其reg字段作为opcode的一部分,使用digit(下表的/digit(Opcode列))指定的数字...因此,有的指令就要复用第一个字节,然后依据ModR/M当中的reg/opcode域进行区分。 CALL指令的表示法:FF /2,是 0xFF 后面跟着一个 /digit 表示的东西。...就是说,0xFF后面需要跟一个ModR/M字节,ModR/M字节使用reg/opcode域 = 2 。...那么,reg/opcode = 2 的字节有32个,正如ModR/M的解释,这32个值代表了32种不同的寻址方式。是哪32种呢?手册上面有张表: 非常复杂的一张表。现在就看看这张表怎么读。...同理, CALL dword ptr [ebx] 是 FF 13,CALL dword ptr [esi] 是 FF 16,这些指令都是2个字节。

    34.3K223

    NX防护机制以及最基本shellcode

    \n"); read(0,buf,0x100); printf("I don't know you,so bye ;)\n"); return 0; } makefile文件..._2:$(OBJS) $(CC) $^ $(CFLAGS) -o $@ clean: $(RM) *.o # 可省略 (向右滑动、查看更多) checksec信息 如图所示...初步确认通过read进行读取 读取的长度为256字节(0x100),由于read是底层的系统调用,所以此处不能武断的认为一定是调用了read,有可能是任何封装了read的函数(如 `fread` ),再通过...确认buf处于栈段中,而且该栈段具有可执行权限 确认栈溢出 进一步通过objdump看看程序的反汇编objdump -D pwn_2 -M intel。...可以明显的看出,栈栈中开辟了0x70的空间,而且其中有 0x64 字节的空间初始化为了 0 (8 * 12 + 4) 确认这部分的空间就是为buf开辟的,所以buf为一个大小为 100 的数组,确认存在栈溢出

    93110

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

    ): 第一个不同之处在于寄存器,64位的寄存器有rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, rip等,对应32位的eax, ebx, ecx, edx, esi, edi...但是,往坏处想一想,没人能阻止用户在终端输入100甚至1000个的字符,当那种情况发生时,会发生什么事情?name数组只有64个字节的空间,那些多余的字符呢,会到哪里去?...的起始指针为0x7fffffffe100、此时的栈顶指针rsp为0x7fffffffe148,name到rsp之间一共0x48(也就是72)个字节,这和之前的分析是一致的。...[rbx+0x21] 以上机器码一共42个字节,name到ret rip之间一共72个字节,因此还需要补30个字节,最后填上name的起始地址0x7fffffffe100。...,之后再跳转到0x9abc,整个流程好像在顺序执行mov rax, 10; mov rbx, 20; add rax, rbx一样。

    4.9K88

    记一起由 Clang 编译器优化触发的 Crash

    从 ASan 给出的信息,我们可以定位到是函数 b2s(bool) 在读取字符串常量 "true" 的时候,发生了“全局缓冲区溢出”。...好了,我们再次以上帝视角审视一下问题函数和复现程序,“似乎”可以得出结论:因为 b2s 的布尔类型参数 b 没有初始化,所以 b 中存储的是一个 0 和 1 之外的值1。...那么问题来了,为什么 b 的这种取值会导致“缓冲区溢出”呢?感兴趣的可以将 b 的类型由 bool 改成 char 或者 int,问题就可以得到修复。...在此之前,我们应该了解: 样例程序中,b2s 的返回值是一个临时的 std::string 对象,是保存在栈上的 C++ 11 之后,GCC 的 std::string 默认实现使用了 SBO(Small..." 的长度 0x00401224 : mov %rax,%rsi # 将字符串起始地址保存至 rsi,即 memcpy 的第二个参数 0x00401227

    1.4K40
    领券