gpt4 book ai didi

linux - 段错误程序集 i386 :x86_64

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:27 26 4
gpt4 key购买 nike

我正在研究 i386:x86_64,我正在编写一个简单的程序来启动 shell。下面是我的程序集。

.section .data
.section .text
.globl _start

_start:
xor %rax, %rax
mov $70, %al
xor %rbx, %rbx
xor %rcx, %rcx
int $0x80

jmp ender

starter:
pop %rbx
xor %rax, %rax
mov %al, 0x07(%rbx)
mov %rbx, 0x08(%rbx)
mov %rax, 0x0c(%rbx)
mov $11, %al
lea 0x08(%rbx), %rcx
lea 0x0c(%rbx), %rdx
int $0x80

ender:
call starter
.string "/bin/sh"

问题是我一直遇到段错误。当我使用 objdump -D my_prog 时,输出是这样的......

.text 部分的反汇编:

0000000000400078 <_start>:
400078: 48 31 c0 xor %rax,%rax
40007b: b0 46 mov $0x46,%al
40007d: 48 31 db xor %rbx,%rbx
400080: 48 31 c9 xor %rcx,%rcx
400083: cd 80 int $0x80
400085: eb 1b jmp 4000a2 <ender>

0000000000400087 <starter>:
400087: 5b pop %rbx
400088: 48 31 c0 xor %rax,%rax
40008b: 88 43 07 mov %al,0x7(%rbx)
40008e: 48 89 5b 08 mov %rbx,0x8(%rbx)
400092: 48 89 43 0c mov %rax,0xc(%rbx)
400096: b0 0b mov $0xb,%al
400098: 48 8d 4b 08 lea 0x8(%rbx),%rcx
40009c: 48 8d 53 0c lea 0xc(%rbx),%rdx
4000a0: cd 80 int $0x80

00000000004000a2 <ender>:
4000a2: e8 e0 ff ff ff callq 400087 <starter>
4000a7: 2f (bad)
4000a8: 62 (bad)
4000a9: 69 .byte 0x69
4000aa: 6e outsb %ds:(%rsi),(%dx)
4000ab: 2f (bad)
4000ac: 73 68 jae 400116 <ender+0x74>

我将猜测并说是标记为(错误)的地址导致了段错误。我知道发生这种情况是因为它希望内存访问未分配给它的内存。我不确定我应该做什么。我正在运行 Linux。

最佳答案

这是段错误,因为您正试图将数据写入内存的代码 (.text) 区域。可执行代码区域几乎总是标记为只读。

这是您的代码以及一些附加注释。

.section .data
.section .text
.globl _start

_start:
xor %rax, %rax
mov $70, %al
xor %rbx, %rbx
xor %rcx, %rcx
; call sys_setreuid(0,0)
int $0x80

jmp ender

starter:
; take the return address off the stack
; rbx will point to the /bin/sh string after the call instruction
pop %rbx
; zero rax
xor %rax, %rax
; save a zero byte to the end of the /bin/sh string (it's 7 characters long)...
; (it will segfault here because you're writing to a read-only area)
mov %al, 0x07(%rbx)
; ...followed by a pointer to the string...
mov %rbx, 0x08(%rbx)
; ...followed by another zero value
mov %rax, 0x0c(%rbx)
; setup the parameters for a sys_execve call
mov $11, %al
lea 0x08(%rbx), %rcx
lea 0x0c(%rbx), %rdx
int $0x80

; what happens when int 0x80 returns?
; you should do something here or starter will be called again

ender:
call starter
.string "/bin/sh"

代码还有其他问题。考虑:

mov %rbx, 0x08(%rbx)
mov %rax, 0x0c(%rbx)

%rbx 是一个 8 字节的值,但代码只给它 4 个字节的空间 (0x0c-0x08 = 4)。如果您想让它正常工作,您需要将字符串移动到 .data 区域(后面有一些额外的空间)并更改代码以使其支持 64 位。

关于linux - 段错误程序集 i386 :x86_64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10212105/

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