Articles of nasm

在NASM中循环一个数组

我想在汇编中学习编程来编写快速高效的代码。 我怎么会偶然发现一个我无法解决的问题。 我想循环一个双字的数组,并添加如下的组件: %include "asm_io.inc" %macro prologue 0 push rbp mov rbp,rsp push rbx push r12 push r13 push r14 push r15 %endmacro %macro epilogue 0 pop r15 pop r14 pop r13 pop r12 pop rbx leave ret %endmacro segment .data string1 db "result: ",0 array dd 1, 2, 3, 4, 5 segment .bss segment […]

在64位linux中分段错误movsb nasm

我是新来的,试图使用一些操作码来获取我的手。 我正在使用64位的linux,并且在使用movsb的时候总会出现分段错误。 我用nasm编译: nasm -f elf64 test.asm 这是代码 DEFAULT ABS segment data data: texte: db 'Hello, World !!', 10, 13 len: equ $-texte texteBis: db 'Hello, World !.', 10, 13 segment code global main main: ;The problem is here mov rsi, texteBis mov rdi, texte mov cx, len rep movsb mov dx, len mov rcx, […]

与NASM的KMP前缀build设

我试图在NASM中实现以下C代码,然后将其链接到C程序并从那里运行。 我试图实现的代码: void preKmp(char *x, int m, int kmpNext[]) { int i, j; i = 0; j = kmpNext[0] = -1; while (i < m) { while (j > -1 && x[i] != x[j]) j = kmpNext[j]; i++; j++; if (x[i] == x[j]) kmpNext[i] = kmpNext[j]; else kmpNext[i] = j; } } 我在NASM的尝试与我的评论: ;nasm -f […]

Linux程序的堆栈以某种非显式方式修改?

我正在尝试在Linux上的NASM上编写一个简单的ELF64病毒。 它将自身附加到受害者身上(当然也包括所有这些部分和细分相关的东西),并改变受害者的入口点,以便指向恶意代码。 当被感染的程序启动时,第一个被执行的是我的病毒,什么时候工作,它跳转到原来的入口点,受害者的代码正在执行。 当病毒感染简单的C ++ hello world时,一切正常,正如我在strace中看到的,病毒正确执行,然后执行受害者的代码。 但是,如果我追加: printf("%s\n", argv[0]); 到受害者的代码,重新感染它并运行,病毒的代码正确执行,“打印你好世界”,但是然后引发一个分段错误错误。 我认为这意味着在病毒执行过程中堆栈正在被更改,以便有一些随机数而不是原始的argv [0]。 但是,我分析了我的病毒的全部来源,标记了rsp的所有推送,popup和直接修改,仔细分析它们,看起来堆栈应该处于相同的状态。 但是,正如我所看到的,事实并非如此。 是否有可能通过例如系统调用以某种非显式方式修改堆栈? 或者,也许这是不可能的,我应该花更多的时间盯着源find一个错误?

基本的nasm shellcode崩溃

我正在学习汇编,所以我正在研究shellcode。 我在nasm写了一个简单的“hello world”程序,但运行时崩溃了。 ; write.asm [SECTION .text] global _start _start: jmp short message; write: ; takes two arguments pushed onto stack -> text, textlen pop edx ; pop length into edx pop ecx ; pop ptr to text into ecx pushad mov al, 4 mov bl, 1 int 80h ; syscall popad ret exit: ; […]

NASM增加了注册bug的价值

我试图添加几个像素在一起,以便在NASM中做一个模糊的filter。 我已经设法添加三个像素的值为00 + d3 + d8(0 + 211 + 216)。 当我尝试添加一个像素,值为0时,程序无法打印可变模糊的值。 更新: 似乎添加到variables总和可以在最多三次完成,因为如果我注释掉另一个add ,值将被打印在我的输出文件。 blurrTopRow: ;from 0 – 251 there will be no pixels above the active pixel ;set ah to 0 to be sure that no other values changes the byte ;save byte in al, ax should be [0000](ah) value(al) mov ah, byte 0 […]

在linux nasm程序集中调用CIO函数

有没有办法从nasm汇编文件中调用Cinput/输出函数?

如何在NASM中不放出本地符号,让GDB disas不会停下来呢?

我正在尝试在Linux上使用nasm编写一些汇编程序。 一切都很好,但是我大量使用本地符号(.loop,.else等),这在debugging时很痛苦,因为这些符号被发送到符号表,例如: [BITS 32] global main section .text main: do stuff .else: do other stuff 会产生一个反汇编,如下所示: <main>: 00000000 do stuff <main.else>: 00000000 do other stuff 这有点烦人,因为gdb会认为这些都是单独的函数,所以当我“disas”时,它只会拆卸一些指令,然后运行到另一个标签并停止。 有没有办法抑制发射这些符号在ELF符号表使用NASM下的Linux?

如何通过ld将NASM程序链接到libc?

我有一个NASM(ArchLinux i686) SECTION .data LC1: db "library call", 0 SECTION .text extern exit extern printf ;global main ;main: global _start _start: push LC1 call printf push 0 call exit 这是与命令汇编: nasm -f elf libcall.asm 如果用_start注释两行,并用main注释掉两行,则用命令汇编和链接: gcc libcall.o -o libcall 然后程序运行OK。 但是如果用_start入口点来组装代码并且用命令链接: ld libcall.o -o libcall -lc 然后,在bash中启动程序(通过命令./libcall )后,将返回以下错误消息: bash: ./libcall: No such file or directory […]

我如何find使用NASM的string的长度?

我正在尝试使用从命令行参数获取input的NASM。 由于string长度没有提供,我试图做一个函数来计算我自己的。 这里是我的尝试,它接受一个指向ebx寄存器中的string的指针,并返回ecxstring的长度: len: push ebx mov ecx,0 dec ebx count: inc ecx inc ebx cmp ebx,0 jnz count dec ecx push ebx ret 我的方法是通过string逐个字符,并检查它是否为空。 如果不是,我会增加ecx并转到下一个字符。 我相信问题是与cmp ebx,0是不正确的,我想要做的。 我将如何正确地检查字符是否为空? 另外,还有其他的事情可以做得更好吗?