【发布时间】:2021-05-11 05:07:59
【问题描述】:
我只学习汇编程序(nasm)并且有更多问题。例如,我想制作获取有关操作系统信息的 asm 代码。我使用 linux 86 位。在代码中,我使用系统调用 uname。在浏览器中有更多关于这个系统调用和代码的信息。我找到了这个链接:
https://github.com/hc0d3r/asm/blob/master/uname.asm
Uname syscall in buffer overflow
但我使用的是 86 位系统。所以,我尝试为我的系统重写代码。我知道,在寄存器 eax 中我应该移动系统调用的值(0x7a 或 122)和数组的寄存器 ebx 地址。
我以第一个链接为例,但出现错误。那么,你能帮我解决这个问题吗?
这是我的主要代码:
extern printf
SYS_WRITE equ 4
SYS_UNAME equ 122
SYS_EXIT equ 60
STDOUT equ 1
section .data
str: db '%s',10,0
UTSNAME_SIZE equ 65
space db ' '
break_line db 0xa
section .bss
uname_res resb UTSNAME_SIZE*5
section .text
global main
main:
mov eax, 0x7A
mov ebx, uname_res
int 80h
push dword [uname_res]
push dword str
call printf
mov eax, 1
int 80h
我得到了这个错误:
segmentation error (memory dump made)
printf 上的这个错误。对不起我的英语歪了
【问题讨论】:
-
我不习惯将参数推送到堆栈中,但是您是否尝试过
push str而不是push dword [str]?另外,86位是指x86吗? -
@mediocrevegetable1 我改变了推送。现在“推 dword str”。在互联网上使用“push dword str”。我使用 linux x86
-
@mediocrevegetable1 错误仍然存在。不显示信息
-
x86 并不意味着 86 位。只有 16、32 和 64 位 x86
-
不记得系统调用 0x7a 做了什么,但
push dword [uname_res]可能是错误的,您可能想要push uname_res。此外,请熟悉 gdb、radare2 或任何调试器,它们将帮助您了解崩溃问题。
标签: linux assembly x86 nasm system-calls