c-我的代码给出了Linux上的环境变量



这些代码中的一些可能没有任何意义,(也许甚至我也很困惑)关于这是如何发生的以及为什么?这个代码是为了其他目的,(我试图制作一个计算器,所以主要的源代码(几乎没有问题)作为我的问题存在于这个网站上)我不知怎么破坏了它,所以我修改了它,并提取了最初破坏它的代码。

我在Kali Linux上测试了它。

这是代码:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
//Some of this might not make any sense, but its the way i was able to break it.. somehow
int main(int argc,char *argv[]) {
FILE *file = fopen(argv[2],"a");
if(file == NULL) {
printf("Error Opening File!");
return 1;
}
char ch;
int i;
printf("%in",argc);
printf("%in",argv);
while((ch = getopt(argc,argv,"d:"))!=EOF)
switch(ch) {
case 'd':
for(i=4; i<=48; i++) // This loop may vary on other system. On first run i used "i<=51" , and on different system, same os, its the mentioned condition
fprintf(file,"%s n",argv[i]);
fclose(file);
break;
default:
fprintf(stderr,"No such command");
}
argc-=1;
argv+=1;

return 0;
}

运行时产生了以下结果(原始源代码。此代码将把它写入文件):

argv处的

值=LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:或=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:.tar=01;31:.tgz=01;31:.arc=01;31:.arj=01;31:.taz=01;31:.lha=01;31:.lz4=01;31:.lzh=01;31:.lzma=01;31:.tlz=01;31:.txz=01;31:.tzo=01;31:.t7z=01;31:.zip=01;31:.z=01;31:.Z=01;31:.dz=01;31:.gz=01;31:.lrz=01;31:.lz=01;31:.lzo=01;31:.xz=01;31:.zst=01;31:.tzst=01;31:.bz2=01;31:.bz=01;31:.tbz=01;31:.tbz2=01;31:.tz=01;31:.deb=01;31:.rpm=01;31:.jar=01;31:.war=01;31:.ear=01;31:.sar=01;31:.rar=01;31:.alz=01;31:.ace=01;31:.zoo=01;31:.cpio=01;31:.7z=01;31:.rz=01;31:.cab=01;31:.wim=01;31:.swm=01;31:.dwm=01;31:.esd=01;31:.jpg=01;35:.jjpe=01;35:.mjpg=01;35:.mjpeg=01;35:.gif=01;35:.bmp=01;35:.pbm=01;35:.pgm=01;35:.ppm=01;35:.tga=01;35:.xbm=01;35:.xpm=01;35:.tif=01;35:.tif=01;35:.png=01;35:.svg=01;35:.svgz=01;35:.mng=01;35:.pcx=01;35:.mov=01;35:.mpg=01;35:.mpeg=01;35:.m2v=01;35:.mkv=01;35:.webm=01;35:.ogm=01;35:.mp4=01;35:.m4v=01;35:.mp4v=01;35:.vob=01;35:.qt=01;35:.nuv=01;35:.wmv=01;35:.asf=01;35:.rm=01;35:.rmvb=01;35:.flc=01;35:.avi=01;35:.fli=01;35:.flv=01;35:.gl=01;35:.dl=01;35:.xcf=01;35:.xwd=01;35:.yuv=01;35:.cgm=01;35:.emf=01;35:.ogv=01;35:.ogx=01;35:.aac=00;36:.au=00;36:.flac=00;36:.m4a=00;36:.mid=00;36:.midi=00;36:.mka=00;36:.mp3=00;36:.mpc=00;36:.ogg=00;36:.ra=00;36:.wav=00;36:.oga=00;36:.opus=00;36:.spx=00;36:.xspf=00;36:

argv=XDG_MENU_PREFIX=gnome-处的值

argv=LANG=en_IN 处的值

argv=GDM_LANG=en_IN 处的值

argv处的值=MANAGERPID=793

argv=DISPLAY=处的值:1

argv处的值=INVOCATION_ID=3e7f771adfde4001af637f9527e9cc9d

argv处的值=COLORTERM=真彩色

argv=USERNAME=根处的值

argv=XDG_VTNR=2 时的值

argv=SSH_AUTH_SOCK=/run/user/0/keyring/SSH 处的值

argv=S_COLORS=自动处的值

argv=XDG_SESSION_ID=3 处的值

argv=USER=根处的值

argv=DESKTOP_SESSION=gnome 处的值

argv处的值=PWD=/media/root/F89A7139AF6CCDE

argv=HOME=/root 处的值

argv=JOURNAL_STREAM=9:19456 处的值

argv处的值=SSH_AGENT_PID=945

argv=QT_ACCESSIABILITY=1 处的值

argv=XDG_SESSION_TYPE=x11 处的值

argv的值=XDG_DATA_DIRS=/usr/share/ggnome:/usr/local/share/:/usr/share/

argv=XDG_SESSION_DESKTOP=gnome 处的值

argv的值=DBUS_STARTER_ADDRESS=unix:path=/run/user/0/bus,guid=11C587e1337f9fb06858C415bbac73a

argv=GTK_MODULES=gail:atk桥处的值

argv=WINDOWPATH=2 处的值

argv=TERM=xterm-256彩色处的值

argv=SHELL=/bin/bash 处的值

argv=VTE_VERSION=5002 时的值

argv处的值=DBUS_STARTER_BUS_TYPE=会话

argv=XDG_CURRENT_DESKTOP=GNOME 处的值

argv=GPG_AGENT_INFO处的值=/run/user/0/gnupg/S.GPG-AGENT:0:1

argv=SHLVL=1 时的值

argv=XDG_SEAT=seat0 处的值

argv=LANGUAGE=en_IN:en-处的值

argv处的值=WINDOWID=39845894

argv=GDMSESSION=gnome 处的值

argv处的值=GNOME_DESKTOP_SESSION_ID=这是不推荐使用的

argv=LOGNAME=根处的值

argv的值=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/BUS,guid=11C587e1337f9fb06858C415bbac73a

argv=XDG_RUNTIME_DIR=/run/user/0 处的值

argv=XAUTHORITY=/run/user/0/gdm/XAUTHORITY 处的值

argv的值=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

argv的值=SESSION_MANAGER=local/kali:@/tmp/.ICE unix/894,unix/kali:/tmp/.ICE unix/894

argv=_=处的值/a.out

argv处的值=(空)

我接下来的问题是,环境变量到底是什么?为什么我会给我这样的结果?

// probably use one option at a time
//This code has some flaws, for example i didnt check if the file was opened 
or not, etc, pardon me for it. This is the actual un-edited source of the 
code.
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int add(int a,int b){
return a+b;
}
int subtract(int a, int b){
return a-b;
}
int main(int argc, char *argv[]){
FILE *file1 = fopen("Results.txt","a");
char ch;
int res;
while((ch=getopt(argc,argv,"a:s:"))!=EOF)
switch (ch){
case 'a':
res = add(atoi(optarg),atoi(argv[3]));
fprintf(file1,"%in",res);
break;
case 's':
res = subtract(atoi(optarg),atoi(argv[3]));
printf("%i n",res);
fprintf(file1,"%in",res);
break;
default:
fprintf(stderr,"No such option");
return 1;
}
//THe commented out section produces weird behaviour...
//printf("Opind = %i, argc = %i, argv = %i n",optind,argc,argv);
argc-=optind;
//printf("value at optarg = %i value at argv_3= %s n",optarg,argv[3]);
argv+=optind;
//printf("Opind = %i, argc = %i, argv = %i n",optind,argc,argv);
//printf("value at optarg = %i value at argv_3= %s n",optarg,argv[1]);
fprintf(file1,"nWritten to filen");
fclose(file1);

return 0;
}   

首先,超出数组的边界会导致未定义的行为。当您在不检查例如i < argc的情况下迭代argv数组时,您可能会这样做(除非您在命令行上实际提供了超过48个参数)。

其次,至于为什么在超出argv的范围时打印环境变量,这是因为在POSIX系统(如Linux或macOS)上,main函数有一个第三个参数,通常称为environ。与argv类似,它是一个包含环境变量的字符串数组(以相同的方式声明,例如char *environ[])。通过超出argv的边界,可以进入environ数组的内存。


在一个相关的注意事项中,您使用argv[2]时不需要检查该参数是否确实存在,或者它不是您用getopt解析的任何其他参数。不要那样做。

还要注意,getopt函数返回一个int。这实际上对于对照-1(而不是EOF!)进行检查非常重要。

相关内容

  • 没有找到相关文章

最新更新