
Както и да е, ето един много прост начин да хващаш програми, да ги криптираш и да ги вградиш в картинка. После съответно да ги изкарваш от картинката, да ги декриптираш и да ги изпълняваш. Картинката (ако е GIF) не се променя (в смисъл с viewer-и разни си изглежда съвсем нормална). Така човек може да си вгражда nmap и nc в директорията си със смешни картинки, хаха
embody.c:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd,fd1,a;
struct stat *st=malloc(sizeof(struct stat));
off_t sz,sz1;
char c,d;
char key[251];
int ki;
off_t *sz2=malloc(sizeof(off_t));
//usage
if (argc==1) {printf("usage: %s <gif_file> <executable>\n",argv[0]);exit(0);}
//get XOR key (first 250 bytes of the image)
fd1=open(argv[1],O_RDONLY);
for (a=0;a<=250;a++) read(fd1,&key[a],1);
close(fd1);
// open files, get stats
fd=open(argv[1],O_WRONLY | O_APPEND);
fd1=open(argv[2],O_RDONLY);
fstat(fd,st);
sz = st->st_size;
fstat(fd1,st);
sz1=st->st_size;
// embed XOR crypted binary
ki=0;
for (a=1;a<=sz1;a++)
{
read(fd1,&c,1);
if (ki==250) {ki=0;} else ki++;
d = c ^ key[ki];
write(fd,&d,1);
}
// write trailer and close
close(fd1);
*(sz2)=sz;
write(fd,sz2,sizeof(off_t));
close(fd);
}
loader.c:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "config.h"
int main(int argc, char *argv[])
{
int fd,fd1;
struct stat *st=malloc(sizeof(struct stat));
off_t sz,sz1;
char c,d;
off_t s;
char key[251];
int ki;
unsigned long a;
// usage, check secretstring
if (argc==1) {printf("usage: %s <gif_file>\n",argv[0]);exit(0);}
if (argc<3) {exit(1);}
if ((strcmp(argv[2],secret)!=0)) {exit(1);}
//get XOR key
fd1=open(argv[1],O_RDONLY);
lseek(fd,0,SEEK_SET);
for (a=0;a<=251;a++) read(fd1,&key[a],1);
close(fd1);
//create temporary binary
fd=open(argv[1],O_RDONLY);
fd1=open("/tmp/.shite",O_WRONLY | O_CREAT);
fstat(fd,st);
sz = st->st_size;
lseek(fd,sz-sizeof(off_t), SEEK_SET);
read(fd,&sz1,sizeof(off_t));
lseek(fd,sz1, SEEK_SET);
// decrypt
ki=0;
for (a=1;a<=sz-sz1-sizeof(off_t);a++)
{
read(fd,&c,1);
if (ki==250) {ki=0;} else ki++;
d = c ^ key[ki];
write(fd1,&d,1);
}
//close, run the binary, delete the binary
close(fd);close(fd1);
system("/lib/ld-linux.so.2 /tmp/.shite");
system("rm /tmp/.shite");
}
build.sh (chmod +x build.sh;./build.sh):
#!/bin/bash
echo "Please enter your secretstring"
read secret
echo -e "#define secret \"$secret\"\n" > config.h
cc embody.c -w -o embody
cc loader.c -w -o loader
echo -e "\n\n"
echo -e "Alright, it must have been built\n"
echo -e "Now type ./embody <gif_file> <binary>\nto embed your binary into the image\n"
echo -e "To run it, type ./loader <gif_file> $secret\n";
Обаче си има много недостатъци. Примерно на скритото binary не могат да се предават параметри (което много лесно може да се оправи). loader-а и embody програмките не са особено сложни за дебъгване и ще лъсне какво правят. И накрая, XOR криптирането с 250-байтов ключ дето се повтаря, не е много особено добро криптиране

Но пък щом става въпрос за лошата полиция, криминалните типове сигурно ще се усъвършенстват доста над тези прости програмки