【问题标题】:linux syscall uname for x86x86 的 linux 系统调用 uname
【发布时间】: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


【解决方案1】:

我为 linux x86 编写了代码。看这里(也许会有用)

https://github.com/OlegInfoSecurity/uname_x86

当我输出(打印)信息时发生此错误。我更改了输出信息的代码,程序运行正常。

【讨论】:

  • 最好在网站上找到答案,而不是链接。你能用一个工作代码的例子来解释问题是什么吗?
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2019-07-17
相关资源
最近更新 更多