Articles of 汇编

64位程序 – Windows“影子空间”的麻烦

我正在尝试用x64汇编语言创build一个程序,但是我在理解x64调用约定时遇到了问题。 我相信问题在于我不知道为了调用CopyFile函数我必须预留多less阴影空间。 当我运行程序时,它只是崩溃。 我使用MASM创build了这个程序。 请帮我解决这个代码。 谢谢。 includelib \Masm64\Lib\Kernel32.lib includelib \Masm64\Lib\User32.lib extrn GetProcessHeap : proc extrn MessageBoxA : proc extrn HeapAlloc : proc extrn GetModuleFileNameA : proc extrn ExitProcess : proc extrn CopyFileA : proc dseg segment para 'DATA' file db 'C:\CopyThisFile.txt', 0 file2 db 'C:\ThisFileWasCopied.txt', 0 succ db 'Success!', 0 capt db 'Debug', 0 dseg […]

GDB没有这样的文件或目录

我正在关注OpenSecurityTraining的这些经验教训。 我已经到了实验室,在那里我要用CMU炸弹训练自己。 他们提供了一个x86_64编译的CMU炸弹,你可以在这里find: CMU炸弹x86-64最初来自CMU实验室计算机系统:程序员的视angular(CS:APP)第一版 32位炸弹。 我有一个虚拟化的64位基本操作系统发行版,我可以毫不费力的使用GDB反汇编CMU Bomb。 现在,我有一个64位的Ubuntu 14.04 LTS(未虚拟化),当我试图重现为什么我做了我的基本操作系统,我得到了着名的错误。 我运行这些命令: gdb ./bomb-x64 (gdb) b main Breakpoint 1 at 0x400dbd: file bomb.c, line 37. — why bomb.c ? (gdb) r … bomb.c: no such file or directory 编辑:我可以在CMU炸弹的其他function上创build断点,并按预期工作。 例如: (gdb) b phase_1 Breakpoint 3 at 0x400f00 (gdb) r Breakpoint 1, 0x0000000000400f00 in phase_1 () (gdb) […]

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 […]

具有限制的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?

如何获得中断向量?

当我运行“cat / proc / interrupts”时,我可以得到以下结果: CPU0 CPU1 0: 253 1878 IO-APIC-edge timer 1: 3 0 IO-APIC-edge i8042 7: 1 0 IO-APIC-edge parport0 8: 0 1 IO-APIC-edge rtc0 9: 0 0 IO-APIC-fasteoi acpi 12: 1 3 IO-APIC-edge i8042 16: 681584 60 IO-APIC-fasteoi uhci_hcd:usb3, nvidia 17: 0 0 IO-APIC-fasteoi uhci_hcd:usb4, uhci_hcd:usb7 18: 0 0 IO-APIC-fasteoi uhci_hcd:usb8 22: […]

ARM inline asm:退出从内存中读取值的系统调用

问题 我想在ARM中使用内联汇编在Linux Android设备上执行退出系统调用,并且我希望从内存中的位置读取退出值。 例 没有提供这个额外的参数,这个调用的macros看起来像: #define ASM_EXIT() __asm__("mov %r0, #1\n\t" \ "mov %r7, #1\n\t" \ "swi #0") 这很好。 接受一个论点,我把它调整到: #define ASM_EXIT(var) __asm__("mov %r0, %0\n\t" \ "mov %r7, #1\n\t" \ "swi #0" \ : \ : "r"(var)) 我用它来调用它: #define GET_STATUS() (*(int*)(some_address)) //gets an integer from an address ASM_EXIT(GET_STATUS()); 错误 无效“asm”:操作数超出范围 我无法解释为什么我得到这个错误,因为我在上面的代码片段(%0 / var)中使用一个inputvariables。 此外,我已经尝试了一个正则variables,仍然有相同的错误。

如何在Linux和Solaris中编译C?

我想要Makefile可以在Linux和Solaris中编译。 我知道如何单独做到这一点,但我怎样才能将两者结合起来,并能够检测出我正在使用的操作系统? 我正在试图做一个简单的C文件 – 但它是编译器的名称更改。

了解C程序中的汇编语言_start标签

我写了一个简单的C程序,并试图使用GDB来debugging程序。 我明白在主要function中使用以下内容: 在进入 push %ebp mov %esp,%ebp 退出时 leave ret 然后我尝试gdb的_start,我得到了以下 xor %ebp,%ebp pop %esi mov %esp,%ecx and $0xfffffff0,%esp push %eax push %esp push %edx push $0x80484d0 push $0x8048470 push %ecx push %esi push $0x8048414 call 0x8048328 <__libc_start_main@plt> hlt nop nop nop nop 我无法理解这些线,以及这背后的逻辑。 有人可以提供任何指导,以帮助解释_start的代码?