furious programming

z tego co widzę, zawartość pliku jest porządnie skopana:

BM–       6   (               `                    ince diostreame
 
i
t nain()
{
 
td::c:t << "Hello, worwo!" << std8tenl;
    return 0;
}

Pod Notepad++ jest jeszcze gorzej :]

grzesiek51114

@furious programming: no cież napisałem, że nie jest idealnie :) Ale prawdą jest, że w środku rzeczywiście jest kod CPP.

furious programming

do ideału to temu jeszcze baaaardzo daleko. No i pomieszałeś znaki - np. nain zamiast main :d

Z formatem BMP (i nie tylko) jest ten problem, że na początku pliku znajduje się obszerny nagłówek, z którym nie ma co zrobić (wstawienie znaków BS go nie skasuje). Nie wiem czy istnieje jakikolwiek format danych nietekstowych, który można by wykorzystać do napisania idealnego kodu, czyli bez jakichś NULLi i innych specjalnych znaków psujących konstrukcję kodu. Trzeba by poszukać.

Z tego co widzę, odpowiedni format to BMP z 24-bitową głębią. Trzeba tylko wybadać to w jakiej kolejności zapisywane są piksele w pliku (albo skorzystać z dokumentacji) oraz jaka jest kolejność zapisywania składowych koloru. Pobawiłem się trochę - składowe zapisywane są w kolejności BGR, czyli jeden piksel to trzy znaki ASCII, w każdym 3-bajtowym chunku pisane od tyłu. Resztę warto wypełnić spacjami.

Można zrobić konkurs - napisz generator, który na wejściu pobierze kod, a na wyjściu wypluje bitmapę :]

grzesiek51114

Tja... te śmieci na początku, abstrahując od tego co udało mi się uzyskać, to nic innego jak nagłówek bitmapy.

Koziołek

Pytanie za 100 punktów wyciągnięcie kolorów za pomocą próbnika?

grzesiek51114

@Koziołek: Nie, kolory były wyciągane na podstawie sześciu parametrów, które definiuje się podczas tworzenia własnych kolorów w Paincie; sześciu liczb. Próbnik nic by tutaj nie dał, ponieważ gif jest marnej jakości i kolory są przekłamane więc lepiej było trzymać się wspomnianych parametrów. Jak już wspomniałem nagranie jest bardzo szybkie, a definiowanie każdego koloru to kilka klatek animacji. W tym czasie autor gif'a mógł zmienić coś w wartościach parametrów czego nawet nie wychwycono. Mogłem po prostu wstawiać już nieaktualne wartości - stąd przekłamania. Za pomocą próbnika to by w ogóle niczego nie było widać.

furious programming

@grzesiek51114: nie baw się w pobieranie kolorów, bo kompresja może wpłynąć na odcienie i dostaniesz śmieci a nie kod. Najpierw musisz zrozumieć sposób w jaki zapisywana jest bitmapa - dzięki temu zrozumiesz w jaki sposób i w jakiej kolejności ustalać kolory pikseli. Jak już to będziesz wiedział to pozostanie jedynie kolorowanie bitmapy, jadąc po kolei po pikselach i z pomocą tablicy ASCII dobierać odpowiednie kody znaków.

Zacznij od przygotowanie sobie przestrzeni dla kodu. W pierwszym pikselu (pierwszym po nagłówku) wpisz trzy razy kod znaku LF - dzięki temu, po otworzeniu pliku w notatniku, w pierwszej linii zapisany będzie jedynie nagłówek, a właściwy kod trzy linijki niżej. To zwiększy czytelność. A do podawania kodów bajtowych używaj okna dialogowego, bo to jedyne miejsce, w którym można podawać liczby z klawiatury. Oczywiście pamiętając o kolejności zapisywania składowych pikseli.

grzesiek51114

@furious programming: Ojej no przecież napisałem, że kolory NIE były pobierane przybornikiem. Autor gifa' każdy kolor definiuje w tym panelu: https://imgur.com/a/zaAAX Jest tam sześć współczynników, które definiują każdy kolor, a które widać w tej animacji. Te właśnie współczynniki są dobrze widoczne i można było je wykorzystać. Przecież jakość tego gifa jest fatalna i nic by z tego nie wyszło gdybym brał kolory przybornikiem :) A kolejność wstawiania pikseli do obrazka też jest znana.

furious programming

@grzesiek51114: tak, tyle że autor tego gifa lubi marnować czas :]

Najszybszym znanym mi rozwiązaniem jest wygenerowanie bitmapy o odpowiednim rozmiarze (aby docelowy kod zmieścił się) i zastąpienie istniejących w niej znaków kodem źródłowym. W ten sposób będziesz mógł przygotować obrazek z idealnym kodem w 5 minut, zamiast przez godzinę przepisywać kody z tabelki, uważając, aby w żadnym pikselu nie pomylić kolejności znaków.

grzesiek51114

@furious programming: kiedyś podobnie bawiłem się w ukrywanie informacji w każdym dowolnym pliku np w Wordzie :) Napisałem sobie nawet programik, który umiał to przeczytać :)

furious programming

a no te pliki są lepsze, bo to zwykłe archiwa i można dodać co sie chce :]

trojanus

ktoś się pokusi o napisanie automatu? Ciekawe jakie farfocle by wyszły jakby jakiś filmik z yt przez taki automat przepuścić. Idealne do haseł jednorazowych :D

axelbest

Ja tylko chciałem zwrócić uwagę na fakt, że kolor w paincie definiowany jest za pomocą 3 składowych i nie ma potrzeby używania aż 6 współczynników. Paint daje do wyboru ustawianie koloru za pomocą HSL oraz RGB.

grzesiek51114

@axelbest: Tak, tak. Kiedy zmieniasz jedną zmienia się reszta.

Shalom

W podobnym klimacie
https://github.com/p4-team/ct[...]04-15-plaid-ctf/web_pixelshop png którego można rozpakować zipem i zawiera w środku php shell
https://github.com/p4-team/ct[...]r/2016-12-27-33c3/web_150_try gif którego można odpalić a haskellu żeby odczytać zawartość /challenge/flag
;)

grzesiek51114

@Shalom Ty to zawsze taki egzotyczny jesteś :)

vpiotr

TL;DR ale jaki problem postawić pixele w takim kolorze żeby zawierały odpowiednie znaki ASCII? Chodzi o to że plik wyjściowy to nie jest bitmapa RGB?

los_pejos

https://pl.wikipedia.org/wiki/Piet
Piet - ezoteryczny język programowania, Programy tworzone w Piet to bitmapy, które wyglądem przypominają abstrakcyjne obrazy. Kompilacji towarzyszy kursor, który porusza się po obrazie „przeskakując” z jednego obszaru o jednolitej barwie na kolejne. Procedury są wykonywane wówczas, gdy kursor opuszcza dany obszar.

vpiotr

Plik PGM pozwala na w miarę poprawne przechowywanie programów, tu przykład czegoś co daje się otworzyć w edytorze tekstu i w przeglądarce obrazków (niestety nie da się skompilować): http://www.filedropper.com/hello_4 (coś tam na końcu chyba jest nie tak - jakby ktoś chciał to wydrukować i powiesić na ścianie)