Articles of nasm

x86_64程序集execve * char 系统调用

我试图进入一些Linux 64位x86程序集,而不使用标准的库,但是我有一些问题处理提交给我的程序(argv)的参数。 我会认为(基于文档) rsp标志着argc qword的开始,而[rsp + 8]将是argv。 不幸的是,情况并非如此,下面的(删节的)程序会导致EFAULT (Bad address) 。 sys_execve equ 59 sys_exit equ 60 section .data child db "/bin/sh", 0 global _start section .text _start: mov rdi, child ; #1 filename mov rsi, [rsp + 8] ; #2 argv mov rdx, 0 ; #3 envp = 0 mov rax, sys_execve ; execve […]

在x86中将string定义为字节(db)和将string定义为字/双字(dw / dd)有什么区别?

我试图调查大会定义标签之间的差异,这里是一个例子 ALabel: db 'Testing' AAnotherLabel: dw 'Testing' 现在,让我加载到一个32位寄存器: mov eax, [ALabel] mov ebx, [AAnotherLabel] 经过gdb的调查,我发现eax和ebx的所有子寄存器都包含相同的值,请看这里: info register eax 0x64636261 //dcba info register ebx 0x64636261 //dcba 他们是一样的! 在Jeff Duntemann的书中(汇编语言使用Linux进行分步编程),他给出了一个单词和双字进入寄存器的例子,但由于某种原因加载了偏移量(即像这样的值的地址) DoubleString: dd 'Stop' mov edx, DoubleString 对edx内容的调查显示,它包含一个地址,可能是string中前四个字母的地址,与第一个地址相同,尽pipe我在这里进行了推测。 我想澄清在这里真正发生了什么,并且这个声明实际上是将string中第一个字母的地址加载到一个寄存器中: Fin: db 'Final' mov ecx, Fin

具有限制的Shellcode

对于我需要创build简单的shellcode的任务,但不允许它包含\ x80。 注意:要在linux上进行系统调用,比如写或者退出,你需要包括这行: int 0x80 ,最后会产生包含\ x80的shellcode。 不过,我需要进行系统调用,所以现在我的想法是使用一个variables作为中断向量编号。 例如0x40,然后将它乘以2,所以最后在shellcode中会有一个\ x40而不是\ x80。 问题是int不是把一个variables作为参数,我试过这个testing: section .data nr db 0x80 section .text global _start _start: xor eax, eax inc eax xor ebx, ebx mov ebx, 0x1 int [nr] 得到 错误:操作码和操作数无效组合 我怎么能让我的想法工作? 或者你有不同的解决scheme? PS。 sysenter和系统调用不起作用 – >非法指令 我在x86-32bit机器上使用nasm。

汇编语言计算器 – Linux x86&NASM – Division

我正在用汇编语言编写一个计算器,以在x86处理器上执行。 基本上,我的计算器要求用户input两个数字,然后指出哪个操作(加法,减法,乘法和除法)要与他们做。 我的计算器加减乘法正确但无法分割 。 在划分时,我总是得到1。 然后我离开我的应用程序代码完成: section .data ; Messages msg1 db 10,'-Calculator-',10,0 lmsg1 equ $ – msg1 msg2 db 10,'Number 1: ',0 lmsg2 equ $ – msg2 msg3 db 'Number 2: ',0 lmsg3 equ $ – msg3 msg4 db 10,'1. Add',10,0 lmsg4 equ $ – msg4 msg5 db '2. Subtract',10,0 lmsg5 equ $ – […]

为什么这个NASM代码打印我的环境variables?

我在这个学期刚刚完成了一个计算机体系结构课程,其中包括我们一直在MIPS组装和在MARS模拟器中运行它。 今天,出于好奇,我开始在我的Ubuntu盒子上与NASM搞混了,基本上只是从教程中拼凑出一些东西,并且感受到了NASM和MIPS的不同之处。 这是我目前正在看的代码片段: global _start _start: mov eax, 4 mov ebx, 1 pop ecx pop ecx pop ecx mov edx, 200 int 0x80 mov eax, 1 mov ebx, 0 int 0x80 这保存为test.asm,并与nasm -f elf test.asm汇编,并与ld -o test test.o链接。 当我使用./test anArgument调用它时,它会按照预期输出“anArgument”,然后input多less字符来填充200个字符(因为mov edx, 200语句)。 不过有趣的是,这些填充字符,我预料会是乱码,实际上是从我的环境variables的开始,如env命令所显示的那样。 为什么这打印出我的环境variables?

在汇编器中打印浮点数

我试图从调用printf函数的汇编程序打印浮点值。 它工作正常的string和整数值,但无法打印浮游物。 这是一个工作代码的例子: global main extern printf section .data message: db "String is: %d %x %s", 10, 0 end_message: db ".. end of string", 0 section .text main: mov eax, 0xff mov edi, message movsxd rsi, eax mov rdx, 0xff mov rcx, end_message xor rax, rax call printf ret string是:255 ff ..string的结尾 所以,参数是通过寄存器传递的: edi包含一个格式化string的地址, rsi和rdx包含相同的数字以十进制和hex格式打印, […]

linux nasm将AL中的值移至AX

我正在打印多个数字整数的方式,将整数除以10,然后收集剩下的部分,然后打印出来。 这是一个有问题的代码段: 划分: ; initial division mov ax, 111 ; number we want to print mov ch, 10 ; we divide by ten to siphon digits div ch ; divide our number by 10 ; al now has 11, ah has 1 mov dh, ah ; save the remainder in dh 1 mov bx, al […]

linux nasm程序集在terminal清除屏幕

有没有办法用nasm清除terminal窗口中的屏幕? 清除屏幕,我的意思是模拟Ctrl-L热键。 删除窗口中的所有文本。 这是可能做在nasm大会? 提前致谢, Rileyh

Linux x86 NASM – 子程序:从EAX打印一个双字

所以我正在学习使用NASM语法的x86 Linux汇编( 哦,上帝,不是这个 ,你们都在想)。 我试图做一个子例程,将简单的EAX输出到标准输出。 代码运行并没有错误退出,但没有打印。 我无法弄清楚为什么。 首先,这里是我正在工作的文件: segment .bss to_print: resd 1 segment .text global print_eax_val print_eax_val: ; (top) push dword ebx ;Stack: edx push dword ecx ; ecx push dword edx ; ebx ; (bot) mov ecx,eax ;ecx = eax mov [to_print],ecx ;to_print = ecx mov eax, 4 ;sys_write mov ebx, 1 ;to […]

x86 ASM Linux – 使用.bss部分

我希望这些问题很简单:(NASM编译器,Linux,x86 Intel语法) 第1部分: 我想弄清楚如何使用Assembly程序的.bss节来find一种方法来存储值,如从一个操作(+ – * /)的值,到一个声明的variables。 例如: section .bss variable: resb 50 ;Imaginary buffer section .text add 10,1 ;Operation ;move the result into variable 所以,我知道有可能用内核来读取用户input(但涉及到string,但是有没有办法将这个值复制到variablesvariables中,以便以后使用?这样会容易得多而不是必须推动和popup两件事情。 第2部分: 有没有办法删除.bss部分中的variables的值? 换句话说,如果我想在.bssvariables中存储一个新的值,那么我怎样才能做到这一点,而variables中已经存在的字符/值不会与新的值相混淆? 谢谢