- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将内存动态分配到堆中,然后在这些内存地址中分配值。我了解如何分配内存,但我如何将例如寄存器中的值分配给第一个动态内存地址?
这是我到目前为止:
push rbp
mov rbp, rsp ;initialize an empy stack to create activation records for the rest of the subroutines
mov rax, 0x2d ;linux system call for brk()
mov rbx, 0x0 ;to get the adress of the first adress we are allocating we must have 0 in rbx
int 0x80 ;calls the linux operating system kernel for assistance
mov [brk_firstLocation], rax ;the first position in the heap will be returned in rax thus i save the first loaction in a varable called brk_firstLocation
mov rbx, rax ;the memory adress of the start of the heap is moved in rbx
add rbx, 0x14 ;we want 5 bytes worth of data alocated in the heap, so the start adress plus 20 bits
mov rax, 0x2d ;linux system call for brk()
int 0x80 ;calls the linux operating system kernel for assistance
例如,我会怎么做
mov
rax
中的值进入
brk_firstLocation
最佳答案
其他人指出您的代码有一些错误。我想补充一点,您不会向当前断点添加 20 位(或像 add rbx, 20
这样的 20 个字节实际上是这样),您只需添加 5 个字节。
此外,您的第一个系统调用参数不会在 rbx 中,而是在 rdi 中。 The 64-bit syscall ABI使用与 32 位 ABI(在 64 位进程中仍然可用)不同的系统调用号、不同的寄存器和不同的指令( syscall
而不是 int 0x80
)。另见 x86标记 wiki 以获得更多 ABI 链接。
您的代码应如下所示:
push rbp
mov rbp, rsp
;; sys_brk(0)
mov rax, 12 ; 12 is SYS_brk (/usr/include/asm/unistd_64.h)
mov rdi, 0 ; rdi for first syscall arg in the 64-bit ABI, not rbx
syscall ; syscall, not int 0x80, for the 64-bit ABI
mov qword [brk_firstLocation], rax
;; sys_brk(old_break + 5)
lea rdi, [rax + 5] ; add 5 bytes to the break point
mov rax, 12
syscall ; set the new breakpoint
mov rdi, [brk_firstLocation] ; load the pointer from memory, if you didn't already have it in a register
mov byte [rdi], 'A' ; a char in the first byte
mov [rdi+1], ecx ; a 32-bit value in the last 4 bytes.
关于linux - 汇编 x86 brk() 调用使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22586532/
自从升级 NodeJs 以来,我从 Visual Studio 2017 运行 Nodejs 时遇到此错误。 断点也不起作用。有任何解决这个问题的方法吗? 注意:VS版本是15.5.6NodeJS 版
我已经使用 VS 2015 在我的计算机上安装了 nodeJs 并进行了设置。当我尝试运行示例 hello world 应用程序时,它抛出以下错误: verb(node:14096) [DEP0062
当我在 Visual Studio 中运行 Node.js 应用程序时,我收到以下消息:DeprecationWarning: 'node --debug' 和 'node --debug-brk'
根据Linux程序员手册: brk() and sbrk() change the location of the program break, whichdefines the end of the
据我所知,在 brk() 系统调用之后,额外的虚拟内存尚未分配(即页表尚未增长以容纳新的虚拟地址)。我的印象是这些页表被添加为 那么...为什么您需要 brk() 系统调用?为什么内核不能在内存访问进
这是 strace -T -ttt -ff -x -y -o pid.trace -p 2145 的输出。跟踪如下。 1503431273.934716 semop(1204093022, {{0,
我写了一个基本的自定义内存管理分配器,它会获取一 block 内存,预先创建 X 对象,这样每当我需要“创建”一个对象时,我就可以获取一个预先创建的对象并简单地分配数据成员(内存已经分配)。 我使用了
我正在尝试将内存动态分配到堆中,然后在这些内存地址中分配值。我了解如何分配内存,但我如何将例如寄存器中的值分配给第一个动态内存地址? 这是我到目前为止: push rbp mov rb
我正在尝试将内存动态分配到堆中,然后在这些内存地址中分配值。我了解如何分配内存,但我如何将寄存器中的值分配给第一个动态内存地址?这是我目前所拥有的: push rbp mov rbp,
我想知道在内核源代码版本 >= 2.6 中定义了 brk。那是哪个c文件包含它的定义? grep 并没有透露太多。另外 sbrk 是在 glibc 中实现的吗? 最佳答案 它在 mmap.c 中。寻找
我正在尝试在 NASM/x86 程序集中使用 sys_brk 分配一些内存。 sys_break返回break的新地址,这是数据段的末尾,对吧?那么我新分配的内存驻留在哪里?我假设它位于旧中断值和新中
不使用brk是否可以实现malloc库函数?我可以使用 sbrk(0) 找出程序中断的当前位置,然后使用 sbrk(size) 对其进行递增吗? 如果是,那么为什么首先要添加 brk? 最佳答案 br
有人可以解释为什么这个“无休止的”循环会很快出现段错误吗?例如,假设我们有这个功能: #!/bin/bash foo() { foo }; foo 8-10 秒后出现段错误。通过 strace 检
我在很多地方(musl 邮件列表、macOS 论坛等)听说 brk() 和 sbrk() 是不安全的。这些地方很多要么根本不解释,要么解释的很模糊。例如,this链接指出“这些功能从根本上被破坏了”,
虽然我知道 Unix 系统调用 brk 和函数 sbrk 的作用,但我不知道它们代表什么。谁能赐教一下? 最佳答案 它来自于“破值”。 我引用:“更改是通过重置进程的中断值并分配适当的空间量来进行的。
我是新手,任何人都可以通过一个简短的例子说出 brk 和 sbrk 之间的确切区别吗?有没有效率因素可以从两者中选择任何一个?malloc 和 new 内部调用 brk 或 sbrk。 最佳答案 in
我编写了一个小的 hello world 程序,并在其二进制文件上运行 strace,它列出了所有在我的 Hello_world 程序执行过程中调用的系统调用。 strace ./a.out exec
我发现并研究了x86 memory access segmentation fault它在我的代码中不起作用。区别可能在于我不使用单独的 .text 和 .data 段,而是通过创建自定义 ELF h
我正在尝试通过简单的脚本使用 Node 检查器。我有一些控制台日志,因此我可以判断它是否正在运行。我尝试了两种方法: Node 调试 test.js 通过这种方法,调试器在 Chrome 中打开,但不
我正在使用 Node v6.10.0 并试图弄清楚为什么我的 --debug-brk 如此缓慢。如果没有此标志(仅使用 --inspect 或 --debug),它几乎是瞬时的,尽管调试器仍然需要很长
我是一名优秀的程序员,十分优秀!