我们在解释老师方面遇到了很多麻烦.我们要求澄清并从他那里得到以下回复
对于execve,使用导出的变量向它发送一个环境,并创建一个内置命令来生成/ bin/bash的子shell,这样就可以使用env查看导出的变量.
(他在谈论在这里创建我们自己的环境变量.)
这与我在Stack Overflow上的以下帖子有关(阅读这篇文章将帮助您理解我想要做的事情):
我们对此非常困惑.我将再次解释我们现在要做的事情.与你的Linux shell如何做到这一点,我们需要编写自己的程序,可以设置环境变量,如PATH和USER以及用户想要定义的其他任何变量.
你将如何调用它的一个例子是(在你的程序中提示):
mysetenv dog spike
Run Code Online (Sandbox Code Playgroud)
这将创建一个看起来像"dog = spike"的环境变量
更重要的是,我们需要能够设置自己的PATH变量并将其发送到exec命令.这是一个令人困惑的部分,因为基于我们所有的问题,我们不明白我们应该做什么.
我有以下示例程序:
#include <stdio.h>
int
main(int argc, char ** argv){
char buf[100];
printf("Please enter your name: ");
fflush(stdout);
gets(buf);
printf("Hello \"%s\"\n", buf);
execve("/bin/sh", 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
我当我没有任何管道运行时,它应该工作,并返回一个shpromt:
bash$ ./a.out
Please enter your name: warning: this program uses gets() which is unsafe.
testName
Hello "testName"
$ exit
bash$
Run Code Online (Sandbox Code Playgroud)
但这不适用于管道,我想我知道为什么会这样,但我无法找到解决方案.示例运行波纹管.
bash$ echo -e "testName\npwd" | ./a.out
Please enter your name: warning: this program uses gets() which is unsafe.
Hello "testName"
bash$
Run Code Online (Sandbox Code Playgroud)
我认为这与以下事实有关:以一种接收EOF 的方式gets清空并且stdin在/bin/sh没有错误消息的情况下退出.
但是我如何解决这个问题(如果可能的话,不修改程序,如果没有gets …
我在执行时遇到一些问题。我正在尝试制作一个可以像 bash shell 一样运行的 shell,但是我在分叉的子进程执行命令时遇到问题。这是我为孩子准备的。cmd 是一个 char * ,其中包含用户输入的命令。但是,当我运行此程序时,我从 perror 中收到此错误:
execve error: No such file or directory.
Run Code Online (Sandbox Code Playgroud)
我已经用一个简单的 ls 尝试过该程序,它应该使 path="/bin/ls" 并执行它(我已经确认这是我的 ls 命令所在的位置),但它仍然抱怨。我究竟做错了什么?谢谢!
if(pid == 0)
{
// Parse the command
char * word = strtok(cmd, " ");
char path[128] = "/bin/";
strcat(path, word);
// Execute the process
char * newenvp[] = { NULL };
char * newargv[] = { path, NULL };
ret = execve(path, newargv, newenvp);
if(ret == -1)
perror("execve error");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud) 我有一个进程在执行程序后立即被杀死.这是已编译的可执行文件的代码,它是一个小程序,它读取由标准输入(通常是描述性文件)中的数字表示的多个图形,并使用Prim算法找到每个图形的最小生成树(它不显示结果,它只是找到解决方案).
#include <stdlib.h>
#include <iostream>
using namespace std;
const int MAX_NODOS = 20000;
const int infinito = 10000;
int nnodos;
int nAristas;
int G[MAX_NODOS][MAX_NODOS];
int solucion[MAX_NODOS][MAX_NODOS];
int menorCoste[MAX_NODOS];
int masCercano[MAX_NODOS];
void leeGrafo(){
if (nnodos<0 || nnodos>MAX_NODOS) {
cerr << "Numero de nodos (" << nnodos << ") no valido\n";
exit(0);
}
for (int i=0; i<nnodos ; i++)
for (int j=0; j<nnodos ; j++)
G[i][j] = infinito;
int A,B,P;
for(int i=0;i<nAristas;i++){
cin >> A >> B >> P;
G[A][B] = P; …Run Code Online (Sandbox Code Playgroud) 我想让系统在没有setuid文件“+p”功能的情况下可用,并且通常没有在我设置PR_SET_NO_NEW_PRIVS时禁用的东西。
使用这种方法(init集合PR_SET_NO_NEW_PRIVS和基于文件系统的能力提升不再可能),您无法“重新填充”您的能力,只需要小心不要“泼洒”它们。
如何在execve不“飞溅”任何授予的功能的情况下进行其他处理(例如新程序的文件是否为setcap =ei)?只是“我相信这个新过程就像我相信自己一样”。例如,赋予用户一项能力(并且用户想在他启动的任何程序中行使它)......
我可以永久制作整个文件系统=ei吗?我想让文件系统不干扰该方案,不能授予或撤销功能;通过父->子事物控制一切。
我用gcc编译并链接了最基本的C程序test.c:
int
main() {
}
Run Code Online (Sandbox Code Playgroud)
正如所料,输出是动态链接的可执行文件:
$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x0f806c099f74132a158d98aebde4639ae0998971, not stripped
Run Code Online (Sandbox Code Playgroud)
运行strace提供以下输出:
$ strace -f ./test
execve("./test", ["./test"], [/* 31 vars */]) = 0
brk(0) = 0x248d000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f77eeb27000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=109292, …Run Code Online (Sandbox Code Playgroud) 我的问题更多的是理论性而非实际性,我找到了更多的答案来解释我们如何在通话中使用列表,而不是为什么subprocess.Popen。
例如众所周知:
Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> cmd = subprocess.Popen(["python", "-V"], stdout=subprocess.PIPE)
Python 2.7.10
Run Code Online (Sandbox Code Playgroud)
然后我在UNIX上乱搞,发现了一些有趣的东西:
mvarge@ubuntu:~$ strace -f python -V 2>&1
execve("/usr/bin/python", ["python", "-V"], [/* 29 vars */]) = 0
Run Code Online (Sandbox Code Playgroud)
可能两者execve和使用的列表模型subprocess都有某种相关性,但是任何人都可以对此给出一个很好的解释吗?
提前致谢。
我正在测试在os.execve虚拟环境中进行一些恶作剧。sys.executable如果我将当前的python进程替换为另一个python子进程,就会遇到空的问题。
以下示例显示了发生的情况(在python shell中运行):
import os, sys
print(sys.executable) # works this time
os.execve("/usr/bin/python", [], {}) # drops me into a new python shell
import sys # yes, again
print(sys.executable) # is empty
Run Code Online (Sandbox Code Playgroud)
我在python shell中运行以上命令的完整输出:
lptp [ tmp ]: python
Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, sys
>>> print(sys.executable) # works this time
/usr/bin/python
>>> os.execve("/usr/bin/python", [], {}) # drops …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行以下操作execve:/bin//nc -lnke /bin/bash -p 4444
在阅读 的手册页时execve,我看到以下要求:
int execve(const char *filename, char *const argv[],
char *const envp[]);
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是将参数推到argv; 我不明白你如何推动一个数组(在汇编中)以使其正常工作。
我目前使用的程序集如下:
global _start
_start:
xor eax, eax
; command
push eax
push 0x636e2f2f
push 0x6e69622f
mov ebx, esp
; args
push eax
push 0x34343434
push 0x20702d20
push 0x68736162
push 0x2f6e6962
push 0x2f20656b
push 0x6e6c2d20
mov ecx, esp
; null, arg 1
push eax
mov edx, esp
; push to stack
push edx
push ecx …Run Code Online (Sandbox Code Playgroud) 浏览http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html
execve我理解了调用并试图重写它的nasm 程序。
一些背景信息:
int execve(const char *filename, char *const argv[], char *const envp[]);
Run Code Online (Sandbox Code Playgroud)
因此,eax = 11( 的函数调用号execve),ebx应该指向char* filename,ecx应该指向argv[](这将与第一个参数相同,ebx因为第一个参数是其*filename本身,例如在本例中为“/bin/sh”),并且edx将指向envp[](null在本例中)。
原始nasm代码:
global _start
section .text
_start:
xor eax, eax
push eax
; PUSH //bin/sh in reverse i.e. hs/nib//
push 0x68732f6e
push 0x69622f2f
mov ebx, esp
push eax
mov edx, esp
push ebx
mov ecx, esp
mov al, …Run Code Online (Sandbox Code Playgroud)