标签: nasm

在Linux下执行平面二进制文件

有没有办法在Linux中执行平面二进制映像,使用如下语法:

nasm -f bin -o foo.bin foo.asm
runbinary foo.bin
Run Code Online (Sandbox Code Playgroud)

linux assembly nasm

6
推荐指数
2
解决办法
3597
查看次数

NASM编程 - "int0x80"与"int 0x80"

我有一个简单的NASM程序,它只调用sys_exit:

segment .text
    global _start
    _start:
        mov eax, 1 ; 1 is the system identifier for sys_exit
        mov ebx, 0 ; exit code
        int 0x80 ; interrupt to invoke the system call
Run Code Online (Sandbox Code Playgroud)

当我第一次写它时,我犯了一个错误,忘记了int和之间的空间0x80:

        int0x80
Run Code Online (Sandbox Code Playgroud)

...但程序仍然编译没有问题!

[prompt]> nasm -f elf MyProgram.asm
[prompt]> ld -o MyProgram MyProgram.o
Run Code Online (Sandbox Code Playgroud)

当我运行它时它只给了我一个分段错误!

[prompt]> ./MyProgram
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

那么这个程序 - 我写的原始程序,缺少的空间 - 是做什么的呢?int0x80在NASM 中(没有空格)是什么意思?

segment .text
    global _start
    _start:
        mov eax, 1
        mov ebx, 0
        int0x80 ; no space...
Run Code Online (Sandbox Code Playgroud)

syntax assembly interrupt nasm

6
推荐指数
1
解决办法
2224
查看次数

将十进制转换为十六进制

首先,这是家庭作业.

我正在尝试将5位数字读入寄存器bx.假设该数字不大于65535(16位).以下是我试图这样做的方式.

但是,当我尝试打印数字时,我只打印输入的最后一个数字.这让我想到,当我向bx添加另一个号码时,它会覆盖以前的号码,但我无法看到问题.任何帮助将不胜感激,我几乎可以肯定它是一个小我忽略的东西: - /

mov cx,0x05 ; loop 5 times
    mov bx,0    ; clear the register we are going to store our result in
    mov dx,10   ; set our divisor to 10

read:
    mov ah,0x01     ; read a character function
    int 0x21        ; store the character in al
    sub al,0x30     ; convert ascii number to its decimal equivalent
    and ax,0x000F   ; set higher bits of ax to 0, so we are left with the decimal
    push ax         ; store …
Run Code Online (Sandbox Code Playgroud)

assembly nasm multiplication

6
推荐指数
1
解决办法
5523
查看次数

系统调用的良好参考

我需要一些参考但是一个很好的参考,可能有一些很好的例子.我需要它因为我开始使用NASM汇编程序在汇编中编写代码.我有这个参考:

http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html

这是非常好的和有用的,但它有很多限制,因为它不解释其他寄存器中的字段.例如,如果我使用写入系统调用,我知道我应该在EAX寄存器中放置1,并且ECX可能是指向字符串的指针,但是EBX和EDX呢?我想要解释一下,EBX确定输入(stdin为0,其他为1等),EDX是要输入的字符串的长度等等.我希望你理解我想要的东西,我找不到任何这样的材料,所以这就是我在这里写的原因.提前致谢.

linux assembly reference nasm

6
推荐指数
2
解决办法
3029
查看次数

如何链接两个nasm源文件

我有一个文件定义了非常基本的IO函数,我想创建另一个使用该文件的文件.

有没有办法将这两个文件联系起来?

prints.asm:

os_return:
    ;some code to return to os
print_AnInt:
    ;some code to output an int, including negatives - gets param from stack
print_AChar:
    ;some code to output a char - gets param from stack
Run Code Online (Sandbox Code Playgroud)

usingPrintTest.asm:

main:
   push qword 'a'
   call print_AChar ;gets this from prints.asm somehow (that's my question)
   call os_return   ;and this too..
Run Code Online (Sandbox Code Playgroud)

注意这些不是实际的文件......它们只是用于解释我的问题:)

谢谢!

compiler-construction assembly linker nasm extern

6
推荐指数
1
解决办法
4124
查看次数

如何在NASM程序集中进入32位保护模式?

我正在学习x86程序集,我正在尝试在NASM中制作玩具操作系统,但我不了解一些事情.

我做了一个成功启动内核的bootloader:

  1. 从包含内核文件的软盘加载14个扇区;
  2. 搜索标记为这些扇区的文件kernel.feo;
  3. 将文件加载到内存中的偏移量0x2000;
  4. 使用远程跳转执行内核jmp 0x2000:0x0000.

所以我的内核代码位于0x2000:0内存中.CS可能是因为使用远跳而设置得当.在这个内核代码中,我想进入32位保护模式,但我不确定GDT是如何工作的.当我在虚拟机上运行下面的代码时(QEMU),它不会做任何事情.

我想请你帮我进入32位保护模式!

也就是说,您有以下问题:

  1. 您认为代码是0x7c00:0由于加载而导致的org 0,但可能并非如此.唯一保证的是物理地址.您应该使用远程跳转到您的入口点,以便CS正确设置.
  2. 您出于某种原因进行设置DS,0x2000以便您的代码根本找不到任何数据.您应该设置DS匹配CS,或在CS任何地方使用覆盖(不推荐).
  3. 受保护的模式代码假设从零开始的段,这反过来意味着它预计org 0x7c00当然与您的设置冲突.你应该切换到org 0x7c00和细分0.
  4. VGA文本模式段0xb8000不是0xb80000(少一个零).
  5. 您没有0x55 0xaa在引导扇区末尾的引导签名字节.

我在代码中更正了这些内容:

  1. [org 0x0]被更正为[org 0x2000]并且段被设置为0;
  2. DS被纠正为0而不是0x2000,所以现在它匹配CS;
  3. VGA文本模式段被更正为0xb8000;

但代码不适用于这些更正,它应该打印两个字符串,但它什么都不做! …

x86 assembly nasm gdt

6
推荐指数
1
解决办法
3682
查看次数

为什么在调用printf时会覆盖EDX的值?

我写了一个简单的汇编程序:

section .data
str_out db "%d ",10,0
section .text
extern printf
extern exit
global main
main:

MOV EDX, ESP
MOV EAX, EDX
PUSH EAX
PUSH str_out
CALL printf
SUB ESP, 8 ; cleanup stack
MOV EAX, EDX
PUSH EAX
PUSH str_out
CALL printf
SUB ESP, 8 ; cleanup stack
CALL exit
Run Code Online (Sandbox Code Playgroud)

我是NASM汇编程序和GCC,用于将目标文件链接到linux上的可执行文件.

本质上,该程序首先将堆栈指针的值放入寄存器EDX,然后将该寄存器的内容打印两次.但是,在第二次printf调用之后,打印到stdout的值与第一个不匹配.

这种行为似乎很奇怪.当我用EBX替换该程序中每次使用EDX时,输出的整数与预期的完全相同.我只能推断在printf函数调用期间某些时候EDX会被覆盖.

为什么会这样?如何确保我将来使用的寄存器与C lib函数不冲突?

c assembly nasm inline-assembly

6
推荐指数
2
解决办法
754
查看次数

如何在Mac OS X上创建ELF可执行文件?

我正在学习本教程:https://littleosbook.github.io/#linking-the-kernel

而且我在Mac上.我正处于创建目标文件的位置nasm,我希望将其转换为ELF可执行文件ld.将ld在Mac上看起来并不像它支持ELF格式,但我并不想运行一个虚拟机使用Ubuntu只是做此链接步骤.

是否有可能ld在Mac 上安装GNU 并与Mac一起运行ld

macos nasm elf ld

6
推荐指数
1
解决办法
3433
查看次数

在NASM中划分两个数字

开始自学组装(NASM)我想知道如何划分2个数字(例如在Windows上).

我的代码看起来像这样,但它崩溃了.

global _main
extern _printf

section .text

_main:

mov eax, 250
mov ebx, 25
div ebx
push ebx
push message 

call _printf
add esp , 8
ret

message db "Value is = %d", 10 , 0
Run Code Online (Sandbox Code Playgroud)

我想知道什么是真的错了?它甚至不显示除法后的值.

x86 assembly nasm integer-division

6
推荐指数
1
解决办法
6899
查看次数

Meltdown PoC详细代码审查

我读了关于Meltdown和Spectre的所有周末

我也已经阅读了针对SpectreMeltdown的.pdfs,对于 那些寻求更多关于这些漏洞的知识的人来说,这是必读的,但遗憾的是没有提供有关代码的详细解释.

我在github上发现了各种PoC,这非常有趣,但我缺乏完全理解它的知识.关于特定部分的更多解释,我将感激不尽:

从这个链接https://github.com/dendisuhubdy/meltdown/blob/master/src/poc.c ,以及其他git存储库,这个漏洞的概念中有许多有趣的部分.


时间读

/* Time reads. Order is lightly mixed up to prevent stride prediction */
    for (i = 0; i < 256; i++) {
        mix_i = ((i * 167) + 13) & 255;
        addr = &array2[mix_i * 512];
        time1 = __rdtscp(&junk); /* READ TIMER */
        junk = *addr; /* MEMORY ACCESS TO TIME */
        time2 = __rdtscp(&junk) - time1; /* READ TIMER & COMPUTE ELAPSED TIME */
        if …
Run Code Online (Sandbox Code Playgroud)

c security assembly exploit nasm

6
推荐指数
0
解决办法
572
查看次数