Rating:

> LPIC-n
>
> We did a terrible mistake, someone is preparing for the LPIC exam! We found this command and these files.
>
> $ ./prog <flag.txt > flag && dd if=flag of=flag.txt conv=notrunc bs=1 skip=1
>
> Download: [warm-up-re_1308581f1c3960c0a6853383a8aa17ff2e43405c.txz](https://0xd13a.github.io/ctfs/asis2020/lpic/warm-up-re_1308581f1c3960c0a6853383a8aa17ff2e43405c.txz)

We start with a encrypted flag file and a mangled program source. Let's format it a little bit:

```c
#include<stdio.h>

int main(){
int a=0,b=a;
long long c[178819],d=8,e=257,f,g,h,i=d-9;

for(;a<178819;){
c[a++]=d;
}

for(a*=53;a;a>>=8)
putchar(a);

if((f=getchar())<0)
return 0;

for(;(g=getchar())>=0;){

h=i=g<<8^f;
g+=f<<8;
a=e<(512<<a%8|(a<7))||f>256?a:a>6?15:a+1;

for(;c[i]>-1&&c[i]>>16!=g;)
i+=i+h<69000?h+1:h-69000;

h=c[i]<0;
b|=h*f<<d;

for(d+=h*(a%8+9);d>15;d-=8)
putchar(b=b>>8);

f=h?g-f*256:c[i]%65536L;

if(a<8*h){
c[i]=g*65536L|e++;
}
}

b|=f<<d;

for(d+=a%8;d>-1;d-=8)
putchar(b>>=8);

return!53;
}
```

Essentially the program reads the source file character-by-character with ```getchar``` and outputs the encoded representation with ```putchar```.

We could go full hog into analyzing the algorithm, but let's look at a preamble being output first:

```c
for(a*=53;a;a>>=8)
putchar(a);
```

This looks like a header of some sort that does not depend on the file contents. When we compile and run the program it turns out that the header is ```1F 9D 90```. This looks vaguely familiar and it should - it's a [compressed Tar](https://www.filesignatures.net/index.php?page=search&search=1F9D90&mode=SIG). Use of ```dd``` command strips the first byte of the header off, so when we add it manually we can output the contents:

```sh
$ uncompress -c flag_updated.txt
ASIS{Y3s_asis_L0ves_i0ccc_and_lov3s_obfuscati0ns_and_C_For3vere}
```

Bingo, the flag is ```ASIS{Y3s_asis_L0ves_i0ccc_and_lov3s_obfuscati0ns_and_C_For3vere}```.

Original writeup (https://0xd13a.github.io/ctfs/asis2020/lpic/).