天道酬勤,学无止境

system-calls

AOSP non-obvious syscall() implementation

As far as I know Linux ABI for ARM states that syscall return value is passed via r0 and if it is negative it should be threaded as errno value negated. I.e syscall has ended up with some error. AOSP does this check in some fancy way: ENTRY(syscall) mov ip, sp stmfd sp!, {r4, r5, r6, r7} .cfi_def_cfa_offset 16 .cfi_rel_offset r4, 0 .cfi_rel_offset r5, 4 .cfi_rel_offset r6, 8 .cfi_rel_offset r7, 12 mov r7, r0 mov r0, r1 mov r1, r2 mov r2, r3 ldmfd ip, {r3, r4, r5, r6} swi #0 ldmfd sp!, {r4, r5, r6, r7} .cfi_def_cfa_offset 0 cmn r0, #(MAX_ERRNO + 1) /* Set C flag if r0 is between -4095 and -1

2021-09-24 08:28:16    分类:问答    assembly   linux-kernel   arm   system-calls   libc

如何在内联汇编中通过 syscall 或 sysenter 调用系统调用?(How to invoke a system call via syscall or sysenter in inline assembly?)

问题 在 x86 Linux 中如何直接使用 sysenter/syscall 实现系统调用? 有人可以提供帮助吗? 如果能把amd64平台的代码也展示一下就更好了。 我知道在 x86 中,我们可以使用 __asm__( " movl $1, %eax \n" " movl $0, %ebx \n" " call *%gs:0x10 \n" ); 间接路由到sysenter。 但是我们如何直接使用 sysenter/syscall 进行编码以发出系统调用? 我找到了一些材料 http://damocles.blogbus.com/tag/sysenter/ 。 但还是觉得很难弄明白。 回答1 首先,你不能安全地使用 GNU C Basic asm(""); 语法(没有输入/输出/clobber 约束)。 您需要扩展 asm 来告诉编译器您修改的寄存器。 请参阅 GNU C 手册中的内联 asm 和内联汇编标记 wiki 以获取指向其他指南的链接,以获取有关"D"(1)作为asm()语句的一部分的含义的详细信息。 我将通过编写一个编写Hello World!的程序来向您展示如何执行系统调用Hello World! 通过使用write()系统调用到标准输出。 这是没有实现实际系统调用的程序源代码: #include <sys/types.h> ssize_t my_write(int

2021-09-24 03:47:14    分类:技术分享    linux   gcc   x86   system-calls   inline-assembly

Cannot use set_memory_rw in Linux kernel on ARM64

I am trying to develop a kernel module that hooks the read() system call. for some reason the set_memory_rw() function does not seem to work. I saw another question of this sort but I didn't really understand what to do. I am working on Kali 4.19.93 with Raspberry-pi 4 My code: #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/moduleparam.h> #include <linux/syscalls.h> #include <linux/kallsyms.h> #include <linux/slab.h> #include <linux/kern_levels.h> #include <asm/unistd.h> #include <asm/cacheflush.h> #include <linux/semaphore.h> #include <asm/set

2021-09-24 00:54:28    分类:问答    c   linux-kernel   hook   system-calls   Rootkit

How to invoke a system call via syscall or sysenter in inline assembly?

How can we implement the system call using sysenter/syscall directly in x86 Linux? Can anybody provide help? It would be even better if you can also show the code for amd64 platform. I know in x86, we can use __asm__( " movl $1, %eax \n" " movl $0, %ebx \n" " call *%gs:0x10 \n" ); to route to sysenter indirectly. But how can we code using sysenter/syscall directly to issue a system call? I find some material http://damocles.blogbus.com/tag/sysenter/ . But still find it difficult to figure out.

2021-09-23 16:31:38    分类:问答    linux   gcc   x86   system-calls   inline-assembly

LD_PRELOAD 不能拦截系统调用,只能拦截libcalls?(LD_PRELOAD can not intercept syscalls, but only libcalls?)

问题 我的代码适用于malloc ,但不适用于mmap 。 代码如下: 主文件 #include <stdio.h> #include <stdlib.h> int main(){ int * p = (int*) malloc(sizeof(int)); printf("in main(): value p = %d\n", *p); free(p); } 预加载 #define _GNU_SOURCE #include <time.h> #include <dlfcn.h> #include <stdio.h> #include <sys/types.h> void *(*orig_malloc)(size_t size); void *malloc(size_t size){ printf(" Hooked(preload)! malloc:size:%lu\n", size); return orig_malloc(size); } void * (*orig_mmap)(void *start, size_t length, int prot, int flags, int fd, off_t offset); void * mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset

2021-09-22 08:07:04    分类:技术分享    c   system-calls   ld-preload   systrace

LD_PRELOAD 不能拦截系统调用,只能拦截libcalls?(LD_PRELOAD can not intercept syscalls, but only libcalls?)

问题 我的代码适用于malloc ,但不适用于mmap 。 代码如下: 主文件 #include <stdio.h> #include <stdlib.h> int main(){ int * p = (int*) malloc(sizeof(int)); printf("in main(): value p = %d\n", *p); free(p); } 预加载 #define _GNU_SOURCE #include <time.h> #include <dlfcn.h> #include <stdio.h> #include <sys/types.h> void *(*orig_malloc)(size_t size); void *malloc(size_t size){ printf(" Hooked(preload)! malloc:size:%lu\n", size); return orig_malloc(size); } void * (*orig_mmap)(void *start, size_t length, int prot, int flags, int fd, off_t offset); void * mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset

2021-09-22 08:05:06    分类:技术分享    c   system-calls   ld-preload   systrace

Unix/Linux 系统调用是 POSIX 库函数的一部分吗?(Are Unix/Linux system calls part of POSIX library functions?)

问题 Unix/Linux 系统调用是全部还是大部分在 POSIX 中? 许多 Linux/Unix 编程书籍都说 POSIX 库函数可能是 OS 系统调用的包装器,也可能不是。 例如 http://www.makelinux.net/books/lkd2/ch05lev1sec1 和 https://www.safaribooksonline.com/library/view/understanding-the-linux/0596005652/ch10s01.html POSIX 的一部分(称为单一 UNIX 规范)定义了 UNIX。 因此,我认为 POSIX 定义了 Unix(和 Linux)的系统调用。 那么 Unix/Linux 系统调用是 POSIX 库函数的一部分吗? 谢谢。 回答1 Linux 系统调用在 syscalls(2) 中列出。 大多数是 POSIX,但有些是特定于 Linux 的(例如 signalfd(2) 等...)。 POSIX 是一个规范,并不“了解”系统调用(在 POSIX 视图中,它是一个实现细节)。 一些函数在 POSIX 中标准化,但在 Linux 库代码中实现,例如 dlopen(3)(参见 POSIX dlopen)构建在 mmap(2) 之上...... 回答2 严格来说,你的说法因此我认为POSIX定义了Unix(和Linux

2021-09-20 21:44:43    分类:技术分享    linux   unix   posix   system-calls

在 nasm 中打印浮点数而不绑定到 C 函数(Print floats in nasm without binding to C functions)

问题 我想知道,如何在 Linux 中仅使用系统调用在 nasm 中打印浮点数。 我有以下代码,但它只打印@ section .data num dq 2.0 len equ $ - num section .text global _start _start: mov edx, len mov ecx, num mov ebx, 1 mov eax, 4 int 80h mov eax, 1 int 80h 谁来做对? 回答1 您可以使用 FPU 将浮点数转换为可写字符串。 下面的示例采用 PI(具有相当多数字的数字)和 将浮点数分为整数部分和小数部分, 使用FBSTP将整数部分转换为 BCD 数, 将 BCD 数字转换为 ASCII 字符串, 通过重复乘以 10 并转换生成的整数部分,将小数部分附加为 ASCII 字符串, 用内核函数 4 (sys-write) 写入字符串。 将整数部分转换为 BCD 数并不能涵盖浮点数的整个范围。 此外,希望在经过一定数量的步骤后停止转换小数部分。 并且没有错误检查。 global _start section .bss dec_str: resb 512 section .text double2dec: ; Args: ST(0): FPU-register to convert, EDI: pointer to string

2021-09-20 20:38:25    分类:技术分享    linux   assembly   nasm   system-calls

无法访问打开的/arch/x86/syscalls/syscall_32.tbl(Can't access the open /arch/x86/syscalls/syscall_32.tbl)

问题 当我转移到内核后编写此命令时。 当我编译它时,它没有显示任何列表。是否还有其他命令可以打开列表? open /arch/x86/syscalls/syscall_32.tbl 回答1 漏洞 从文件路径中删除第一个/字符(因为它应该是相对路径)。 检查文件 现在,使用file工具检查此文件是否存在: $ file arch/x86/syscalls/syscall_32.tbl 打印文件 如果文件存在,您可以使用cat或less命令打印它。 例如: $ less arch/x86/syscalls/syscall_32.tbl 您也可以在编辑器中打开此文件,例如使用vi命令。 如果文件不存在 该文件随 Linux 内核源代码一起提供。 它是由这次提交添加到内核 3.3 中的。 所以你应该使用内核版本3.3或更高版本来拥有这个文件。 如何使用syscall_32.tbl文件下载内核 通过 Git 从 kernel.org 下载 vanilla 主线内核源代码(使用此处的说明): $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ 现在您应该弄清楚要使用哪个版本。 这取决于您的任务(您打算如何进一步使用此内核)。 如果打算在 PC Linux 发行版上使用

2021-09-20 13:57:19    分类:技术分享    linux-kernel   system-calls

系统调用超时?(System call time out?)

问题 我正在使用 unix system() 调用来调用 gunzip 和 gzip 文件。 对于非常大的文件,有时(即在集群计算节点上)这些会被中止,而其他时候(即在登录节点上)它们会通过。 系统调用可能花费的时间是否有一些软限制? 还能是什么? 回答1 调用线程应该无限期地阻塞,直到您使用 system() 启动的任务完成。 如果您观察到调用返回并且文件操作未完成,则表明生成的操作由于某种原因失败。 返回值表示什么? 回答2 几乎可以肯定,使用 system() 不是问题,而是您正在执行的操作。 始终检查返回值,但更重要的是,您将希望看到您正在调用的命令的输出。 对于非交互式使用,通常最好将 stdout 和 stderr 写入日志文件。 一种方法是编写一个包装脚本,用于检查底层命令、记录命令行、重定向 stdout 和 stderr(如果您想小心,还可以关闭 stdin),然后执行命令行。 通过 system() 而不是直接通过 OS 命令运行它。 我敢打赌,故障机器的磁盘空间有限,或者缺少目标文件或实际的 gzip/gunzip 命令。 回答3 我正在使用 unix system() 调用来调用 gunzip 和 gzip 文件。 可能很愚蠢的问题:为什么不直接从您的应用程序中使用 zlib? 而且 system() 不是系统调用。 它是 fork()/exec()

2021-09-20 12:54:30    分类:技术分享    c   unix   system-calls