汇编-试图将字节移到内存不起作用

Fab*_*otk 5 assembly gdb x86-64 gnu-assembler

我试图通过更改其中的一个字节来修改存储在内存中的字符串。我为此使用movb,但是由于某些原因,给定存储位置的字节未更改。

在gdb调试器上:

14 movb%al,(%r10)#next instr
(gdb)print / d $ al
$ 4 = 0
(gdb)print / c * $ r10
$ 5 = 47'/'
(gdb)s
16 mov $ 59,%rax
(gdb )打印/ c * $ r10
$ 6 = 47'/'

代码只是:

.globl _start
.text

_start:
        call chamaexecve
        variaveis:
            .asciz "/bin/bashABBBBCCCC"


    chamaexecve: 

        pop %r10
        xor %rax, %rax
        movb %al, (%r10) # problem happening here

        mov $59, %rax
        mov %rsi, %rdi
        mov $0, %rsi
        mov $0, %rdx

        syscall
Run Code Online (Sandbox Code Playgroud)

它正在与as -gstabs -o shellf.o shellf.s-ld -N -z execstack -o shellf shellf.o

编辑为了确保没有记错,我删除了可执行文件并重新编译。错误仍然存​​在。我注意到的另一件事是,如果我movb $'r', %al在将%al移至内存之前添加了一行,'r'则通常会在内存上打印该行,但由于某种原因,它无法使用该$0值。

我正在Linux Mint 18.1“ Serena”滚动版本gnu汇编程序2.26.1上运行此代码。这是x/i $rip用于显示当前指令的打印件:

在此处输入图片说明

Edit2:将break更改为tbreak并将s更改为si之后,我终于看到它从'/'变为'\ 000'。那么,在s / break / gdb全部搞砸之后,可能是什么问题呢?

(gdb)tb 14
临时断点1位于0x4000cd:文件shellf.s,第14行。
(gdb)run
启动程序:/ home / fabio /criação/ nasm-tutorial / shellf

临时断点1,位于shellf.s的chamaexecve(): 14
14 movb%al,(%r10)
(gdb)si
16 mov $ 59,%rax
(gdb)print / c * $ rsi
无法访问地址0x0
(gdb)的内存print / c * $ r10
$ 1 = 0'\ 000 '
(gdb)

fai*_*loo 0

程序的 .text 部分是只读的,如果您想修改字符串,则需要将其放置在 .data 部分中。