gpt4 book ai didi

linux - 从文本部分写入文本部分数据

转载 作者:行者123 更新时间:2023-12-04 13:51:53 25 4
gpt4 key购买 nike

我正在尝试复制一个字符串 s1进入 s2在汇编中,这是我的代码:

global main

main:
.init:
; push r8, r9, r12, rcx

.strcpy:
lea r8, [rel s1]
lea r9, [rel s2]
mov rcx, 0
.copy:
cmp rcx, 7
je .fini
xor r12, r12
mov r12b, [byte r9]
mov [r8], r12b
inc r8
inc r9
inc rcx
jmp .copy

.fini:
; pop rcx, r12, r9, r8
ret

.data:
s1 db "coucou"
s2 db "bonjour"
我有一个段错误第 16 行( mov [r8], r12b )。我在 gdb 的这一行设置了一个断点,即寄存器 r12井包含 0x62 ('b') 和寄存器 r8/ r9分别包含 s1的地址和 s2 .
我做错了吗?一开始以为是权限问题,但是在我的真实程序中(这个已经很简化了),我用 mprotect在text段添加了写权限(并检查它是否成功)。
请注意,我知道 .data标签在文本部分,但我必须这样做。
为了清楚起见,我注释了实际推送/弹出操作的简短版本。

编辑:
这是失败的代码,有更多的上下文:
global main

;##############################################################################

; Just some macros to avoid heavy push / pop boilerplates in the code

%macro pushx 1-*
%rep %0
push %1
%rotate 1
%endrep
%endmacro

%macro popx 1-*
%rep %0
%rotate -1
pop %1
%endrep
%endmacro

;##############################################################################

main:

.init:
pushx rdi, rsi, rdx, rax, r10, r11

mov r10, 0xff ; base addr of the first page containing the .text section
mov r11, 0xff ; len for mrpotects calls

.addrights:
pushx r10, r11

mov rdi, r10 ;
mov rsi, r11 ;
mov rdx, 7 ; PROT_WRITE | PROT_READ | PROT_EXEC
mov rax, 10 ; sys_mprotect
syscall ;
cmp rax, 0 ; check for return value
jl .err ; infinite loop on error

popx r10, r11

.matcpy:
call matcpy

.removerights:
mov rdi, r10 ;
mov rsi, r11 ;
mov rdx, 5 ; PROT_EXEC | PROT_READ
mov rax, 10 ; sys_mprotect
syscall

.fini:
popx rdi, rsi, rdx, rax, r10, r11
ret

.err:
jmp $

;##############################################################################

.data:

mat dd 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574, \
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
0x00000000, 0x00000000, 0x00000000, 0x00000042, \
0x00000000, 0x00000000, 0x00000042, 0x00000042

cpy dd 0, 0, 0, 0 ,\
0, 0, 0, 0, \
0, 0, 0, 0, \
0, 0, 0, 0

;##############################################################################

matcpy:

.init:
pushx r10, r11, r12, rcx

.code:

lea r10, [rel mat]
lea r11, [rel cpy]
mov rcx, 0
.copy:
cmp rcx, 64
je .fini
xor r12, r12
mov r12b, byte [r10]
mov [r11], r12b
inc r10
inc r11
inc rcx
jmp .copy

.fini:
popx r10, r11, r12, rcx
ret

r10r11是我在创建段时替换的硬编码值(我正在做一个打包程序并且必须注入(inject)代码)。
这是它们在运行时的内容示例:(在 matcpy 调用之前)
r10            0x401000            4198400
r11 0x215 533
这是我的程序的映射:
00400000-00401000 r--p 00000000 00:36 31195213     /mnt/nfs/homes/...
00401000-00402000 rwxp 00001000 00:36 31195213 /mnt/nfs/homes/...
00402000-00403000 r--p 00002000 00:36 31195213 /mnt/nfs/homes/...
00403000-00404000 r--p 00002000 00:36 31195213 /mnt/nfs/homes/...
00404000-00405000 rw-p 00003000 00:36 31195213 /mnt/nfs/homes/...
0c001000-0c002000 r-xp 00005000 00:36 31195213 /mnt/nfs/homes/...
此外,程序不会循环,意思是 rax不是负数( mprotect 成功)。
请注意,如果我在 .data 中尝试相同的操作,它会起作用。部分。即使我在我的代码部分设置了写访问模式,这似乎也是一个权限问题。

最佳答案

是的,又是一个愚蠢的错误。
我在运行时为 .text 添加了写权限部分。
但是我注入(inject)的代码在另一段,使用的数据也是如此。
我刚刚添加了一个 PF_W程序头中的标志 p_flags相应段的领域,它就像一个魅力。

关于linux - 从文本部分写入文本部分数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68576934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com