Articles of 汇编

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的代码?

C / asm程序在由非特权用户运行时对Linux有什么危害?

我一直在想一个场景,让用户(可以是任何人,可能是坏的意图)提交在Linux PC上运行的代码(我们称之为基准节点)。 目标是为单线程例程创build一种自动化的基准testing环境。 假设一个网站向代理发布一些代码。 这个代理把这个代码交给基准节点,基准节点只有一个到代理的以太网连接,而不是互联网本身。 如果让一个用户在C / ASM代码上运行基准节点,会面临什么样的安全挑战? 做出以下假设: 该程序作为非特权用户运行 代理将有机会杀死基准节点上的进程(例如以无限循环为例) 代理能够重新启动基准节点(如果它回复…) 那么,这个用户空间程序实际上可能会使操作系统崩溃,还是使代理不可用? 通过汇编,程序员可以基本上做他想做的任何事情(例如操纵堆栈指针),我想知道Linux在这方面的限制/强大。 我也知道进程可能需要与其他进程(shm)共享内存区域,这也可能在这里起作用。 任何有关这个问题的文献或文章都非常受欢迎。 沙盒解决scheme也可能是有趣的,但重要的是,CPU必须执行它在基准testing期间的100%的能力(至less在基准testing的核心上)。