我刚开始学习汇编语言。我用的是在线编译器,但今天我下载了NASM。我试图组装这个简单的代码,将 10 乘以 15:
mov eax, 0xa
mov edx, 0xf
imul eax, edx
ret
Run Code Online (Sandbox Code Playgroud)
尝试执行由 NASM 生成的机器代码失败,因此我在十六进制编辑器中打开此代码并将其与我可以成功执行的在线汇编程序生成的代码进行比较。
纳姆:
66 b8 0a 00 00 00 66 ba 0f 00 00 00 66 0f af c2 c3
Run Code Online (Sandbox Code Playgroud)
在线编辑:
b8 0a 00 00 00 ba 0f 00 00 00 0f af c2 c3
Run Code Online (Sandbox Code Playgroud)
这两个代码之间的唯一区别66是 NASM 生成的代码中不需要的 。谁能帮我?
我正在尝试编写某种漏洞利用程序,但在使我的 asm 代码在堆栈上的任何位置运行时遇到问题。就是这样:
BITS 64
global _start
_start:
mov rax, 59
jmp short file
c1:
pop rdi
jmp short argv
c2:
pop rsi
mov rdx, 0
syscall
ret
file:
call c1
db '/bin/sh',0
argv:
call c2
dq arg, 0 <- problem
arg:
db 'sh',0
Run Code Online (Sandbox Code Playgroud)
由于选定的行,此代码将无法在堆栈上的任何位置工作,因为此代码可以在堆栈上的任何位置执行,因此 nasm 无法正确计算 arg 的地址。(这是shellcode 在作为单独代码单独运行时以及在使用 C++ 代码运行时调用不同系统调用的后续操作,这是问题所在。)
我已经轻松地用 jmp/call/pop 技巧替换了字符串,但指向字符串的指针仍然存在问题。
我需要从端口读取一些 16 位值并将它们保存到缓冲区。我正在使用的教程建议使用 REP INSW 指令,但我不知道如何使用它,甚至不知道它是如何工作的......
这条指令相当于两条IN指令吗?