gpt4 book ai didi

Linux NASM - 重写存储在 .data 段中的字符 - 段错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:59:07 26 4
gpt4 key购买 nike

<分区>

可能是一个非常初学者的问题,但我真的很想知道如何让它发挥作用。

我有以下汇编代码(很大程度上受到 here 的启发,rename() 示例):

[SECTION .text]
global _start

_start:
mov esi, msg ; saves pointer to string to ESI
xor eax, eax
mov byte [esi+6], al ; terminates first string with NULL char
mov byte [esi+13], al ; terminates second string with NULL char
mov byte al, 38 ; syscall number (38 = rename)
lea ebx, [esi] ; put the adress of /tmp/a in EBX
lea ecx, [esi+7] ; put the adress of /tmp/b in ECX
int 0x80 ; syscall execution

mov al, 0x01 ; prepare to exit!
xor ebx, ebx
int 0x80 ; exit!

[SECTION .data]
msg: db '/tmp/a#/tmp/b#'

我来解释一下:这个程序调用系统调用rename将文件/tmp/a重命名为/tmp/bsection中的字符串.data 包含源文件的名称和目标文件的名称。

因为我想避免 NULL,所以我决定用 # 代替 NULL,并在运行时更改它。但是,程序以 SEGFAULT 终止。看起来真的是重写.data 段中的# 字符有问题。我的问题是 - 我应该如何处理它并使其发挥作用?我知道这是一个初学者问题,也许我遗漏了一些非常重要的东西。

感谢您的任何建议。

EDIT - 用于汇编和链接的命令

这是给 NASM 的:

nasm -f elf -o ThisWorks.o ThisWorks.asm

这是链接器(注意我将其构建为 32 位,尽管我有 64 位 Phenom II)。

ld -melf_i386 -o ThisWorks.aout ThisWorks.o

然后我执行它:

./ThisWorks.aout

结果是:

Segmentation fault

反汇编

这是通过 objdump -D ThisWorks.aout 反汇编的

ThisWorks.aout:     file format elf32-i386


Disassembly of section .text:

08048080 <_start>:
8048080: be 9c 90 04 08 mov $0x804909c,%esi
8048085: 31 c0 xor %eax,%eax
8048087: 88 46 06 mov %al,0x6(%esi)
804808a: 88 46 0d mov %al,0xd(%esi)
804808d: b0 26 mov $0x26,%al
804808f: 8d 1e lea (%esi),%ebx
8048091: 8d 4e 07 lea 0x7(%esi),%ecx
8048094: cd 80 int $0x80
8048096: b0 01 mov $0x1,%al
8048098: 31 db xor %ebx,%ebx
804809a: cd 80 int $0x80

Disassembly of section .data:

0804909c <msg>:
804909c: 2f das
804909d: 74 6d je 804910c <_end+0x60>
804909f: 70 2f jo 80490d0 <_end+0x24>
80490a1: 61 popa
80490a2: 23 2f and (%edi),%ebp
80490a4: 74 6d je 8049113 <_end+0x67>
80490a6: 70 2f jo 80490d7 <_end+0x2b>
80490a8: 62 23 bound %esp,(%ebx)

解决方案

调试显示,该程序运行正常,但在没有要重命名的文件时陷入段错误。否则我的代码按预期工作。对此感到抱歉。

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