Nie sądzę, żeby to było takie proste, ale możesz sam zobaczyć kod Ruby:
https://github.com/igrigorik/vimgolf/tree/master/lib/vimgolf
Na przykład widzę klasę do keyloggera.
Oto polecenie używane do uruchomienia vim
w lib / vimgolf / cli.rb :
vimcmd = GOLFVIM.shellsplit + %W{-Z -n --noplugin --nofork -i NONE +0
-u #{challenge.vimrc_path} -U NONE -W #{challenge.log_path} #{challenge.work_path}}
@statox miał (prawie) rację co do -w outfile
... -W outfile
, w rzeczywistości nadpisuje plik, do którego wysyłane są wpisywane znaki, zamiast go dołączać. Ale, jak powiedziałem, nie jest to „takie proste” ... porównaj zawartość jednego z tych plików i tego, co generuje narzędzie vimgolf. Wynika to z rzeczywistego problemu z vimgolfem ...
-W
wyjście po skopiowaniu, a następnie wklejeniu tutaj:
GI0. ý`gvgý`ZZ
Kilka znaków niedrukowalnych „zagubiło się w tłumaczeniu”.
-W
wyjście, jak pojawia się na ekranie:
^VGI0. ^[<80>ý`gvg^A<80>ý`ZZ
Cóż, to trochę brzydkie.
vimgolf wyświetlał / przesyłał dane wyjściowe:
<C-V>GI0. <Esc>gvg<C-A>ZZ
Ahh, tak jest lepiej.
Aktualizacja: Spędziłem kilka minut, przyglądając się nieco bliżej i mam kilka nowych informacji.
Po pierwsze, keylogger klasy keylog.rb, o którym wspomniałem powyżej, jest rzeczywiście istotnym elementem układanki, ale w rzeczywistości jest dość prosty. Kody kluczy, które Vim emituje i które są zapisane w -W
pliku dziennika to albo jeden bajt, albo trzy bajty (wskazane przez pierwszą wartość bajtu 0x80), a dla każdego z dwóch zestawów jest mapa hash.
Wersja jednobajtowa odwzorowuje wartość bajtu na ciąg znaków reprezentujący kod klucza, taki jak 0
lub g
. Wersja trzy bajtowa podobnie mapuje na ciąg znaków (np. <Esc>
Lub <C-V>
), ale używa jako klucza połączonych wartości bajtów dwa i trzy. Istnieją pewne wyjątki / przypadki narożne, które są obsługiwane inaczej, ale zdecydowana większość kodów klawiszy jest rozwiązywana poprzez proste wyszukiwania na tych dwóch mapach.
Widząc, jak podstawowy był kod rejestratora kluczy, mogłem stwierdzić, że coś jest nie tak z tym, co widziałem w plikach dziennika kodu klucza (na przykład przyklejonym powyżej). Okazuje się, że powinienem był użyć pliku vimrc wymaganego przez reguły VimGolf. W szczególności ta linia
set t_RV=
powoduje prawidłowe rejestrowanie. Powyższy przykład „pojawia się na ekranie” wygląda tak:
^VGI0. ^[gvg^AZZ
Teraz widać linię prostą od tego „surowego” ciągu do renderowanej postaci VimGolfa.