Guest User

Untitled

a guest
May 24th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <signal.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include <sys/stat.h>
  7. #include <sys/types.h>
  8. #include <sys/utsname.h>
  9. #include <dirent.h>
  10. #include <pwd.h>
  11. #include <grp.h>
  12. #define S "/>\x10v1"
  13. #define F "8\x1E~\"\x1C"
  14. #define O "HR&K\bS\x15\tMs|\7x\x1b"
  15.  
  16. struct passwd *pw; struct group *gr; struct stat st;
  17. extern char **environ; char b[512];
  18. char h(char*s){char _=*s;while(*s)_=*s+++_+1;return _;}
  19. char*N(char*_){return _&&strchr(_,S[0])?strrchr(_,S[0])+1:_?_:"";}
  20. char*D(char*_){char*n=strrchr(_?_:"",0[S]);if(n)*n=0;return _;}
  21. void d(int A,FILE**B){
  22. long c=**(char**)B, C=c==0x38, x[11]={0}, y=0, d;
  23. if(c==0x1C||(C&&A!=3)) return;
  24. ++B,A-=C+1;
  25. FILE*P=C?B[1]:stdout,*I=A?B[0]:stdin;
  26. C=0;
  27. while(I){
  28. while(!feof(I)){
  29. C+=(d=fgetc(I))==10&&(x[y++%11]=ftell(I));
  30. if(d<0&&c=='"'&&!fseek(I,x[y%11],SEEK_SET)&&(c='~')&&!(C=0))
  31. continue;
  32. if(d>0&&c!='"'&&fputc(d,P)&&C>=10&&c=='~')
  33. break;}
  34. fclose(I);
  35. I=--A>0?*++B:NULL;}
  36. fclose(P);}
  37. void L(char*p,int r){
  38. if(r&&S_ISDIR(st.st_mode)){
  39. DIR*d=opendir(p);
  40. struct dirent*e;
  41. while((e=readdir(d))){
  42. strcpy(b,p);
  43. strcat(b,"/");
  44. strcat(b,e->d_name);
  45. stat(b,&st);
  46. L(b,0);}
  47. closedir(d);
  48. }else{
  49. pw=getpwuid(st.st_uid);
  50. gr=getgrgid(st.st_gid);
  51. printf("%04o %lu %s %s %lu %s\n",st.st_mode&07777,
  52. st.st_nlink,pw->pw_name,gr->gr_name,st.st_size,N(p));}}
  53. void e(int A,char**B){
  54. int s=A>1&&!!strchr("\240\237",B[1][0]+B[1][1]);
  55. int _=s+**B;
  56. B+=s+1;
  57. long a=-1;
  58. while(--A){
  59. char*s=NULL;
  60. int(*f)(const char*,const char*)=NULL;
  61. stat(*B,&st);
  62. switch(_){
  63. case'\7':if(a<0){pw=getpwnam(*B);a=pw->pw_uid;}else chown(*B,a,st.st_gid);break;
  64. case'|':if(a<0){gr=getgrnam(*B);a=gr->gr_gid;}else chown(*B,st.st_uid,a);break;
  65. case'\x1b':kill(atoi(B[1]),atoi(&(*B)[1]));return;
  66. case'H':f=link;break;
  67. case'I':f=symlink;break;
  68. case'&':s=N(*B);break;
  69. case'K':s=D(*B);break;
  70. case'\b':s=*B;break;
  71. case'S':unlink(*B);break;
  72. case'M':L(*B,1);break;
  73. case'R':f=rename;break;
  74. case'T':remove(*B);break;
  75. case'\x15':rmdir(*B);break;
  76. case'\t':mkdir(*B,0755);
  77. case's':if(a<0)a=strtol(*B,NULL,8);else chmod(*B,a);break;
  78. case'x':chroot(*B);chdir("/");execvp(B[1],B+1);break;}
  79. if(f){
  80. f(B[0],B[1]);
  81. return;}
  82. if(s)puts(s);++B;}}
  83. int main(int A,char**B){
  84. char _=**B=h(N(*B))&0x7F;
  85. struct utsname u;int i;
  86. uname(&u);
  87. switch(!!strchr(S,_)+!!strchr(S F,_)+!!strchr(S F O,_)+!!(h(N(*B))==-063)*2){
  88. case 3:while(_=='1'&&*environ)puts(*environ++);
  89. while(_=='\x4D'){putchar(_^'4');putchar('\n');}
  90. return _=='v'||_=='1'||!puts(_=='>'?getcwd(b,512):u.sysname);
  91. case 2:for(i=1;i<A;++i){
  92. char*_=B[i];
  93. B[i]=(char*)fopen(_,access(_,F_OK)!=-1?"r+":"w+");
  94. if(!B[i])B[i]=(char*)fopen(_,"r");}
  95. d(A,(FILE**)B);break;
  96. case 1:e(A,B);}return 0;
  97. }
Add Comment
Please, Sign In to add comment