Articles of 汇编

了解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的核心上)。

为什么gcc重新sorting函数中的局部variables?

我写了一个只读/写大型数组的C程序。 我用gcc -O0 program.c -o program编译了程序出于好奇,我用objdump -S命令来objdump -S C程序。 read_array和write_array函数的代码和程序集附在这个问题的末尾。 我正试图解释gcc如何编译函数。 我用//添加我的评论和问题 以write_array()函数的汇编代码的开始部分为write_array() 4008c1: 48 89 7d e8 mov %rdi,-0x18(%rbp) // this is the first parameter of the fuction 4008c5: 48 89 75 e0 mov %rsi,-0x20(%rbp) // this is the second parameter of the fuction 4008c9: c6 45 ff 01 movb $0x1,-0x1(%rbp) // comparing with […]

NASM Linux程序集打印整数

我正在尝试在linux上的nasm程序集中打印一个数字的整数。 我目前编译的很好,但没有写入屏幕。 任何人都可以向我解释我在这里做错了吗? section .text global _start _start: mov ecx, 1 ; stores 1 in rcx add edx, ecx ; stores ecx in edx add edx, 30h ; gets the ascii value in edx mov ecx, edx ; ascii value is now in ecx jmp write ; jumps to write write: mov eax, ecx ; […]

帮助理解GDB中一个非常基本的main()反汇编

Heyo, 我已经写了这个非常基本的主要function来实验反汇编,也看到并希望了解底层的事情: int main() { return 6; } 使用gdb disas main产生这个: 0x08048374 <main+0>: lea 0x4(%esp),%ecx 0x08048378 <main+4>: and $0xfffffff0,%esp 0x0804837b <main+7>: pushl -0x4(%ecx) 0x0804837e <main+10>: push %ebp 0x0804837f <main+11>: mov %esp,%ebp 0x08048381 <main+13>: push %ecx 0x08048382 <main+14>: mov $0x6,%eax 0x08048387 <main+19>: pop %ecx 0x08048388 <main+20>: pop %ebp 0x08048389 <main+21>: lea -0x4(%ecx),%esp 0x0804838c <main+24>: ret 这里是我最好的猜测,我觉得是怎么回事,我需要帮助逐行: […]

如何在Linux下使用汇编和系统调用dynamic分配内存

我正在寻找一些使用Linux下的汇编语言和使用系统调用,而不是malloc和朋友的dynamic内存分配的很好的代码示例。 什么是一些最简单但有效的方法来做到这一点? 在Intel 386+电脑上。

理解由一个简单的C程序生成的汇编代码

我试图通过使用gdb的反汇编器来检查一个简单的C程序的组件级代码。 以下是C代码: #include <stdio.h> void function(int a, int b, int c) { char buffer1[5]; char buffer2[10]; } void main() { function(1,2,3); } 以下是main和function的反汇编代码 gdb) disass main Dump of assembler code for function main: 0x08048428 <main+0>: push %ebp 0x08048429 <main+1>: mov %esp,%ebp 0x0804842b <main+3>: and $0xfffffff0,%esp 0x0804842e <main+6>: sub $0x10,%esp 0x08048431 <main+9>: movl $0x3,0x8(%esp) 0x08048439 <main+17>: […]

GCC:putchar(char)inline assembly

溢出, 我怎么才能实现使用内联汇编的putchar(char)过程? 我想在x86-64程序集中做到这一点。 我这样做的原因是实现我自己的标准库(或至less它的一部分)。 这是我到目前为止: void putchar(char c) { /* your code here: print character c on stdout */ asm(…); } void _start() { /* exit system call */ asm("mov $1,%rax;" "xor %rbx,%rbx;" "int $0x80" ); } 我正在编译: gcc -nostdlib -o putchar putchar.c 感谢您的帮助!

Linux汇编错误“在'asm'中不可能的约束

我从Linux下的汇编开始。 我已经将下面的代码保存为testasm.c 并编译为:gcc testasm.c -otestasm 编译器回复:“asm'中不可能的约束”。 #include <stdio.h> int main(void) { int foo=10,bar=15; __asm__ __volatile__ ("addl %%ebx,%%eax" : "=eax"(foo) : "eax"(foo), "ebx"(bar) : "eax" ); printf("foo = %d", foo); return 0; } 我该如何解决这个问题? (我从这里复制了这个例子。) Debian Lenny,内核2.6.26-2-amd64 gcc版本4.3.2(Debian 4.3.2-1.1) 分辨率 : 看到接受的答案 – 看起来“修改”的条款不再支持。

使用自定义引导加载程序创build可启动的ISO映像

我正试图将我用汇编语言编写的引导程序转换为ISO映像文件。 以下是来自MikeOS bootloader的代码。 这是我的bootloader代码: BITS 16 start: mov ax, 07C0h ; Set up 4K stack space after this bootloader add ax, 288 ; (4096 + 512) / 16 bytes per paragraph mov ss, ax mov sp, 4096 mov ax, 07C0h ; Set data segment to where we're loaded mov ds, ax mov si, text_string ; […]