Weird argv[1] x86_64 Linux Assembly

liwlm1x9  于 2023-05-07  发布在  Linux
关注(0)|答案(1)|浏览(170)

我得到argv[1]的值是x86_64 Linux Assembly,但一些额外的bash内容被添加到最后。我可以删除它的唯一方法是通过保留更少的字节,但argv[1]将是一个动态值。

bits 64

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;          MACROS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%define SYS_WRITE 1
%define SYS_EXIT 60
%define EXIT_SUCESS 0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;         SECTIONS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

section .bss
    filename: resb 32

section .data
    usage_msg: db "Usage: ./pac <filename>", 10, 0
    usage_msg_len: equ $-usage_msg

section .text
    global _start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;    PROGRAM ENTRY POINT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_start:
    pop rax                 ; pop argc into rax
    cmp rax, 2              ; make sure <filename> has been passed
    jl .not_enough_args

    jmp .enough_args

.not_enough_args:
    call print_usage
    jmp .exit

.enough_args:
    pop rax
    pop rax                 ; pop argv[1] into rax
    mov [filename], rax     ; move argv[1] into filename

    ; print filename for testing
    mov rax, SYS_WRITE
    mov rdi, SYS_WRITE
    mov rsi, [filename]
    mov rdx, 32
    syscall

    jmp .exit

.exit:
    mov rax, SYS_EXIT
    mov rdi, EXIT_SUCESS
    syscall

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;          CALLS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

print_usage:
    mov rax, SYS_WRITE
    mov rdi, SYS_WRITE
    mov rsi, usage_msg
    mov rdx, usage_msg_len
    syscall
    ret

使用这个程序,我得到以下输出:

$ ./pac file.txt
file.txtSHELL=/bin/bashSESSION

请帮我一下。谢谢大家。

du7egjpx

du7egjpx1#

有一段时间了,我决定重写一遍。不知道我做了什么不同的,但我解决了它。我还添加了puts和strlen。

bits 64

%define SYS_WRITE 1
%define STDOUT 1
%define SYS_EXIT 60
%define EXIT_SUCCESS 0

section .bss
    prog: resb 32
    src: resb 32

section .data
    usage_arg1: db " <filename>", 10, 0

section .text
    global _start

_start:
    pop rax ; argc
    mov rdi, rax

    pop rax ; argv[0]
    mov [prog], rax
    mov rax, rdi
    
    cmp rax, 2
    jl .not_enough_args
    
    pop rax ; argv[1]
    mov [src], rax

    mov rsi, [src]
    call puts

    jmp .exit
    
.not_enough_args:
    call print_usage

.exit:
    mov rax, SYS_EXIT
    mov rdi, EXIT_SUCCESS
    syscall

; IN: rdi points to string
; OUT: rax contains string length
strlen:
    xor rax, rax
    dec rax
.top:
    inc rax
    cmp byte [rdi + rax], 0
    jne .top
    ret

; IN: rsi which points to a string
puts:
    push rax
    push rdi
    push rdx
    
    mov rdi, rsi
    call strlen
    mov rdx, rax
    
    mov rax, SYS_WRITE
    mov rdi, STDOUT
    syscall

    pop rdx
    pop rdi
    pop rax
    ret

print_usage:
    mov rsi, [prog]
    call puts
    mov rsi, usage_arg1
    call puts
    ret

输出:

$ ./prog
Usage: ./prog <filename>
$ ./prog file.txt
file.txt

相关问题