我试图通过更改其中的字节来修改存储在内存中的字符串。我正在使用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
显示当前指令的打印件:
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)
答案 0 :(得分:0)
程序的.text部分是只读的,如果您要修改字符串,请将其放置在.data部分中。