Articles of 进程

在64位堆栈驻留缓冲区溢出?

我正在研究一些安全相关的事情,现在我正在玩我自己的堆栈。 我所做的应该是非常微不足道的,我甚至不试图执行堆栈,只是为了表明我可以控制64位系统上的指令指针。 我已经closures了所有的保护机制,只是为了能够使用它(NX-bit,ASLR,还用-fno-stack-protector -z execstack编译)。 我在64位汇编方面没有太多的经验,花了一些时间寻找和尝试自己,我想知道是否有人能够解决我遇到的问题。 我有一个程序(源代码如下),它只是将一个string复制到一个堆栈驻留缓冲区,没有边界检查。 但是,当我覆盖了一系列的0x41我期待看到RIP被设置为0x4141414141414141,而我发现我的RBP被设置为这个值。 我确实遇到了分段错误,但即使将RSP设置为合法值,RIP在执行RET指令时也不会更新为此(非法)值。 我甚至在GDB中validation过,在RET指令之前,在RSP上有一系列包含0x41的可读存储器。 我在LEAVE指令的印象之下: MOV(E)SP,(E)BP POP(E)BP 然而,在64位上,“LEAVEQ”指令似乎做了(类似于): MOV RBP,QWORD PTR [RSP] 我认为这只是在执行这条指令之前和之后观察所有寄存器的内容。 LEAVEQ似乎只是RET指令的一个依赖于上下文的名字(GDB的反汇编给出的),因为它仍然只是一个0xC9。 而且RET指令似乎是用RBP寄存器做些事情的,可能会解引用它? 我的印象是RET所做的(类似于): MOV RIP,QWORD PTR [RSP] 但是就像我刚才提到的那样,它似乎取消了RBP的引用,我正在考虑这样做,因为当没有其他寄存器似乎包含非法值时,我得到了分段错误。 程序的源代码: #include <stdio.h> #include <string.h> int vuln_function(int argc,char *argv[]) { char buffer[512]; for(int i = 0; i < 512; i++) { buffer[i] = 0x42; } printf("The buffer is […]

为什么僵尸进程存在?

维基百科说:“一个终止但永远不会被父母等待的儿童stream程变成了一个僵尸stream程。” 我运行这个程序: #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t pid, ppid; printf("Hello World1\n"); pid=fork(); if(pid==0) { exit(0); } else { while(1) { printf("I am the parent\n"); printf("The PID of parent is %d\n",getpid()); printf("The PID of parent of parent is %d\n",getppid()); sleep(2); } } } 这会创build一个僵尸进程,但我不明白为什么在这里创build一个僵尸进程? 该程序的输出是 Hello World1 I am the parent […]

在64位Linux服务器上运行64位JVM的好处/缺点?

我们在64位Linux 2.6服务器上运行32位Sun Java 5 JVM,但显然这将每个进程的最大内存限制为2GB。 所以有人build议我们升级到64位的JVM来消除这个限制。 我们目前在服务器上运行多个JVM(Tomcat实例)以保持2GB的限制,但为了简化部署,我们希望整合它们。 如果你已经这样做了,你能分享一下你的经验吗? 你在运行64位的JVM吗? 你会build议留在Java 5,还是可以同时移动到Java 6 和 64位? 我们是否应该期望性能问题,无论好还是坏? 有什么特别的地方应该关注我们的回归testing吗? 感谢您的任何提示!

什么是Linux进程表? 它是由什么组成的?

这个术语不断出现在我的操作系统笔记中,我不完全确定它是什么/它在哪里存储以及如何或为什么。

find由nohup命令运行的进程

我使用以下命令"nohup server &"在Centos中运行服务器可执行文件。 现在我需要杀死进程"server" 。 但是我尝试了"ps -a"命令来获得PID但是我无法得到这个过程。 现在如何杀死"server"呢?

在64位ubuntu编译32位汇编程序

我有用32位汇编语言编写的程序…现在我只是不能在64位操作系统上编译它。 在我们的学校他们是具体的,程序必须写在32位版本。 这是我的程序: bits 32 extern _printf global _start section .data message db "Hello world!!", 10, 0 section .text _start: pushad push dword message call _printf add esp, 4 popad ret 任何想法? 我已经尝试了很多方法来编译它。 编译后输出错误: nasm -f elf64 vaja4.asm ld vaja4.o -o vaja4 ./vaja4 输出: vaja4.o: In function `_start': vaja4.asm:(.text+0x7): undefined reference to `_printf'

Linux系统调用创build进程和线程

我在一篇论文中读到,创build进程和线程的底层系统调用实际上是相同的,因此通过线程创build进程的成本并不是很高。 首先,我想知道创build进程/线程的系统调用是什么(可能是示例代码或链接?) 其次,作者是否正确地认为创build进程而不是线程是便宜的? 编辑: 引用文章: 使用进程replacepthread是非常便宜的,特别是在使用相同的底层系统调用调用pthread和进程的Linux上。

如何在Linux中由两个不同的进程调用共享库文件?

在Linux中,我有一个名为foo.so的共享库文件当我执行2个不同的进程p1,p2,它们都使用foo.so. 这个foo.so是否被这两个过程重叠?

一个专门为我的过程核心

可能重复: 如何设置特定pthread的CPU亲和力? 在Linux中有一种方法可以禁用除一个进程之外的所有进程的一个内核吗? 我想只有一个核心保留,只为我的过程。 预期行为如下: 在我的过程后会产生的进程,不应该看到这个核心,并使用其他的。 当我的进程产生时,所有正在使用此内核的进程都应该切换到其他内核。

使用exec在新进程中执行系统命令

我试图产生一个执行系统命令的进程,而我自己的程序仍在继续,两个进程将并行运行。 我正在linux上工作。 我在网上查询,听起来像我应该使用exec()家庭。 但是它不能像我所期望的那样工作。 例如,在下面的代码中,我只看到“之前”被打印,而不是“完成”。 我很好奇,如果我什么都没有问题? #include <unistd.h> #include <iostream> using namespace std; main() { cout << "before" << endl; execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", (char *) 0); cout << "done" << endl; } [UPDATE] 谢谢你们的评论。 现在我的程序看起来像这样。 一切工作正常,除了最后,我不得不按下完成程序。 我不知道为什么我要按最后input? #include <unistd.h> #include <iostream> using namespace std; main() { cout << "before" << endl; int pid […]