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

时间:2017-02-15 00:26:03

标签: assembly gdb x86-64 gas

我试图通过更改其中的字节来修改存储在内存中的字符串。我正在使用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)print / 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

正在使用as -gstabs -o shellf.o shellf.s - ld -N -z execstack -o shellf shellf.o

进行编译

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

我在Linux Mint 18.1“Serena”滚动版本,gnu汇编程序2.26.1上运行它。以下是使用x/i $rip显示当前指令的打印件:

enter image description here

EDIT2 : 在将break更改为tbreak并将s更改为si之后,我看到它最终从'/'变为'\ 000'。那么在所有s / break / gdb搞砸之后会出现什么问题呢?

  

(gdb)tb 14
  临时断点1在0x4000cd:文件shellf.s,第14行。
  (gdb)运行
  启动程序:/ 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)

1 个答案:

答案 0 :(得分:0)

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