Jump to content
cmiN

[Programare] Misiunea 1: Evadarea (cmiN)

Recommended Posts

... de cmiN, inspirat din niste jocuri puzzle / adventure ...

Te doare capul cumplit si deodata deschizi ochii si te trezesti intr-o camera abandonata, ca o celula. Te uiti speriat in stanga si in dreapta si nu vezi decat 4 ziduri de beton rece, o usa metalica cu gratii in loc de macar un gemulet si un birou langa peretele din fata ta.

Incerci usa, care e incuiata si apoi o iei razna, incepi sa tipi, sa plangi, nu stii unde te afli, ce cauti aici si de ce nu poti macar iesi afara. Tremurand, incepi sa cotrobai prin camera, prin sertare si nu gasesti absolut nimic decat o lanterna cu lumina slaba, un creion, un tabel ascii si o foaie de hartie nici prea mare nici prea mica pe care scrie cu font mic si de mana:

"Toti cand eram mici am invatat ca cifrele incep de la 0 si se termina la 9."
Nedumerit bagi hartiuta, creionul, tabelul ascii si lanterna in buzunar si cauti in continuare, dar in zadar. Nu mai gasesti absolut nimic si deodata niste sunete stranii, ca niste tipete, se aud de dupa perete! Ingrozit nu stii ce sa mai faci, incerci sa tragi biroul sa spargi usa cumva cu el, dar fara sa vrei descoperi o gura de aerisire fara gratar in spatele biroului. Intri pe ea, tragi biroul inapoi in locul care era pentru a bloca intrarea si apoi mergi cu grija mai departe, luminand cu lanterna bezna rece din tubul stramt prin care te tarai, la fel cum mintea ti-ar fi dictat pas cu pas ce trebuie sa faci -,-. Auzi usa camerei din care ai plecat trantindu-se si realizezi ca sunt pe urmele tale, insa continui sa mergi.

De-a lungul tubului de abia observi cu lanterna blocuri de numere numerotate si, sperand sa te ajute la ceva, le scrii mic si inghesuit cu creionul pe foaia de hartie, pastrand ordinea. Observi ca toate blocurile de numere pe care le gasesti contin cifre de la 0 la 9 in ordine diferita, fiecare bloc avand lungimea de 9 sau 10 caractere si nu se repeta nicio cifra, toate cifrele sunt distincte (de e.x.: 043658971 sau 5678934201 ). Continui sa mergi prin tub, iar pe toti peretii nicio alta gura, ci numai numere. Miraculos foaia iti ajunge la fix pentru toate numerele si zaresti din departare in capatul tubului o alta gura de aerisire, fara sa mai fie si alte numere. Lanterna incepe sa palpaie, semne ca bateriile sunt pe terminate si te indrepti cu repeziciune spre gura de aerisire, care spre mahnirea ta are gratarul pus. Deodata se aud aceleasi sunete stranii, numai ca de aceasta data se aud din spatele tau prin tubul de aerisire. Speriat, incerci sa bati in gratar / sa-l scoti, dar acesta nici nu se clinteste... sunetele se aud din ce in ce mai tare si devin din ce in ce mai sinistre si plin de adrenalina generata de frica cu o ultima lovitura reusesti a scoate gratarul din suruburi. Cobori si ajungi intr-o alta camera. Intuneric peste tot nu vezi nimic, insa auzi undeva pe langa tine sunetul unui ventilator ... ti se pare ceva cunoscut ... te apropii usor incepi sa pipai si realizezi ca este o unitate centrala. Pipai in continuare si dai si de monitor pe care il aprinzi si astfel se lumineaza cat de cat incaperea. Imediat blochezi gura de aerisire pe care ai coborat cu un dulap mare si greu gasit in acea incapere. Cotrobai in continuare, dar nu gasesti nimic decat doar acel PC si o usa metalica ce pare a fi conectata la el printr-un cablu. Nu iti dai seama deloc ce sistem de operare ar putea avea acel pc, pentru ca pe un fundal complet negru nu vezi decat un fel de executabil si atat. Avand doar tastatura la dispozitie, il accesezi si o consola ce pare cunoscuta iti afiseaza mesajul:

"Password: "
Folosind talentele tale de "hecher" incerci mai multe parole si alte trucuri insa nimic nu pare sa se schimbe. Te gandesti putin si scoti foaia din buzunar pe care scrie mic si inghesuit:

8643210598249731653976415802306578492789653214965248037615230849757630924871324896556912470319863472059570826436829143571790468238473296150765823104812643057620814573975042936856372491824916078370915348265697428308275640939748215033910854267783042615295013468953208147635670289467284530967938012564178530927983642057418935266078214933149028765176249085215807694756813429061728054960851394791560374284371825909380264179641207358758290634428371659892376410728046913582917640501487936518726594307253480690524837969520348174692570831326480759768304529508196273641895230773942608584513296759470238603452167895620147833427601585781320694023947856594680372592631048359124608739027865476245890394120875305479168328654097126758103496970532814742036598514867329693751248702513648928503479686942137558739620487154293608920761546801534790183647529627530948865037429380561947963501742872864593093586740226309158734150982673752984064759862132984307619568321047930826754589643127805412367043729651805689472387059324698436150240976528138253074965921784635327409614807631295892641570145063987951842037627346905885643209763549172867485392100625498734169528379347806210746932581796032458278643950902147536453978061245069372837146985275609248334061879255879423609826314579731420654398105276763085291892517340042186579327409165875980613483471692507642013597935164829315820476385176402534098216429805673170354296836029574885106729313827650492436705986038594722897056348136572490453269078872954163912745063562047913884015763252134906853742096816725890416901857348657104293746952380342598706618403597358910674237456802936724981552409738646731509280687925434720983565378619247031492865245309687982340567573084129912758406379450326846298357090137856289642135075364807292890647350286135498690312574480975216640359178530764128976342081548093256118962740535174806920346581797231645809602359874579431268412697538264378159093428570646918257342630987530249875610378516424123670593246570918964582370621743859923471506261074385920356978437295084645093678289320164573172856400253716845321407698413705286083512694923876041578956410217365984095846720315648027394903872655692418303490127865938624075862075349982763401723586410976812403586041359261452893076254870917594683013470269581293768450675142839290683475601754829397632548032476850939486721090587216347098354627549026833782941059250137648396547820763152849293078645248051739630687912473425906175816029344962587108641973501438027956037524196927386451430915276808432576163905281483401972658250967434251687392518367947681542390285419360092715438514309286703964287542896750374308256951926470838125463707043562188690421735243758609827354196138924650019368752417805296376152048347205319866270894316859471029542083671743168920984502317890236417568701243926408915792385074612187603490739254687190463258

apoi incerci a introduce tot codul de numere, insa din nou nimic nu se intampla, apoi te uiti mai bine la cod si incerci sa-l decodifici cumva. Ai incredere in instinctele tale si stii ca textul obtinut in final trebuie sa fie un string alfanumeric, si ca 100% iti va folosi acel tabel ascii insa mai trebuie sa fie ceva, ceva legat de dexteritatea ta de a te juca cu numere chiar daca nu prea le ai cu matematica. Parola finala este singura ta scapare !!!

Cerinta: Sa se construiasca un algoritm prin care sa se afle parola si mesajul din spatele codului sau macar sa se afle parola si mesajul fara a fi nevoie neaparat si de algoritm.

Eu am facut in python o librarie pentru ambele functii si codare si decodare si merge excelent. O voi posta cand se da batuta toata lumea. Modul de codare e extrem de simplu, doar trebuie sa fiti atenti la ce am scris si sigur va prindeti. Succes!

P.S.: Algoritmul meu are doar 18 linii (partea pentru decodare) deci va dati seama cat de simplu e. In final trebuie sa ajungeti la o propozitie lunga de un rand in limba romana care va zice ceva despre parola, va prezinta parola. Asa ca pana nu ajungeti la acel scris nu mai postati toate numerele care va trec prin minte!

Link to comment
Share on other sites

hmmm...cmin daca tu ai scris toata aia de felicit, m-as baga si eu la rezolvare dar nu prea am cunostinte, decat de incepator, totusi cred ca fiecare caracter al propozitiei tale l-ai transformat in ascii.... si a rezultat codul ala lung. E adevarat ce zic? sau sunt tampenii?

Link to comment
Share on other sites

Interesant joculetul si o prezentare...beletristica.

Spoiler alert: felici....felicia? :)

e Felici... :P mi se strica algoritmul la 't' - revin cu amanunte.

Frumoasa idee, m-a pus pe ganduri de ce 9 sau 10.

Parola pentru a debloca usa este: P**L***1***3

Edited by loki
Link to comment
Share on other sites


<?
function srcch($s)
{ for($i=0; $i<=9; $i++)
if(!strstr($s."x",$i.'')) return $i;
}

$sir='8643210598249731653976415802306578492789653214965248037615230849757630924871324896556912470319863472059570826436829143571790468238473296150765823104812643057620814573975042936856372491824916078370915348265697428308275640939748215033910854267783042615295013468953208147635670289467284530967938012564178530927983642057418935266078214933149028765176249085215807694756813429061728054960851394791560374284371825909380264179641207358758290634428371659892376410728046913582917640501487936518726594307253480690524837969520348174692570831326480759768304529508196273641895230773942608584513296759470238603452167895620147833427601585781320694023947856594680372592631048359124608739027865476245890394120875305479168328654097126758103496970532814742036598514867329693751248702513648928503479686942137558739620487154293608920761546801534790183647529627530948865037429380561947963501742872864593093586740226309158734150982673752984064759862132984307619568321047930826754589643127805412367043729651805689472387059324698436150240976528138253074965921784635327409614807631295892641570145063987951842037627346905885643209763549172867485392100625498734169528379347806210746932581796032458278643950902147536453978061245069372837146985275609248334061879255879423609826314579731420654398105276763085291892517340042186579327409165875980613483471692507642013597935164829315820476385176402534098216429805673170354296836029574885106729313827650492436705986038594722897056348136572490453269078872954163912745063562047913884015763252134906853742096816725890416901857348657104293746952380342598706618403597358910674237456802936724981552409738646731509280687925434720983565378619247031492865245309687982340567573084129912758406379450326846298357090137856289642135075364807292890647350286135498690312574480975216640359178530764128976342081548093256118962740535174806920346581797231645809602359874579431268412697538264378159093428570646918257342630987530249875610378516424123670593246570918964582370621743859923471506261074385920356978437295084645093678289320164573172856400253716845321407698413705286083512694923876041578956410217365984095846720315648027394903872655692418303490127865938624075862075349982763401723586410976812403586041359261452893076254870917594683013470269581293768450675142839290683475601754829397632548032476850939486721090587216347098354627549026833782941059250137648396547820763152849293078645248051739630687912473425906175816029344962587108641973501438027956037524196927386451430915276808432576163905281483401972658250967434251687392518367947681542390285419360092715438514309286703964287542896750374308256951926470838125463707043562188690421735243758609827354196138924650019368752417805296376152048347205319866270894316859471029542083671743168920984502317890236417568701243926408915792385074612187603490739254687190463258';
$pos=0;
while($pos<2813)
{ $sute=substr($sir,$pos,9);

$code=0;
if(srcch($sute)==1)
{ $code=100;
$pos+=9;
}

$cifra=substr($sir,$pos,9); $code+=srcch($cifra)*10;
$cifra=substr($sir,$pos+9,9); $code+=srcch($cifra);
echo chr($code);
$pos+=28;
}
?>

php. nu e perfect ca mi-am prins urechile in strstr. I-am bagat un x in coada sa imi dea conditia cum trebe

Edited by loki
Link to comment
Share on other sites

Nu prea am inteles mare lucru, oricum nu stiu php, dar pare cam ciudata ideea :))) ... pe ce se bazeaza zi cum faci :P ?

A meu arata asa:

#! /usr/bin/env python
# 14.07.2009 <> 14.07.2009 | cmiN
# Challenge [Programare] Misiunea 1: Evadarea (cmiN) @ rstcenter.com


__doc__=""" This library encodes a string to a numeric string
and decodes a numeric string to a string."""
__usage__=""" Usage:
[+] Encode a string:
sh_cipher.py encode "string"
[+] Decode an encoded string:
sh_cipher.py decode "7956...532"
"""


import os, random, sys


def encode(instr):
outstr, aenstr="", ""
for x in instr:
aenstr+=str(ord(x))+" "
z=" "
for x in aenstr:
numbers=["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
if not x==" ":
numbers.remove(x)
random.shuffle(numbers)
while z==numbers[0]:
random.shuffle(numbers)
z=x
for x in numbers:
outstr+=x
del instr, aenstr, numbers, x, z
return outstr


def decode(outstr):
l=[]
aenstr, instr="", ""
l[:]=outstr
while len(l)!=0:
if l[9] in l[:9]:
numbers=["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
for x in l[:9]:
numbers.remove(x)
aenstr+=numbers[0]
l[:9]=[]
else:
aenstr+=" "
l[:10]=[]
aenstr=aenstr.strip(" ")
for x in aenstr.split(" "):
instr+=chr(int(x))
del outstr, aenstr, numbers, x, l
return instr


def main():
args=sys.argv
if len(args)!=3:
print(__doc__)
print(__usage__)
else:
if args[1]=="encode":
print(encode(args[2]))
elif args[1]=="decode":
print(decode(args[2]))
else:
raise Exception
del args


if __name__=="__main__":
try:
main()
except:
print("An error occurred!")
os.system("pause >NUL")

Link to comment
Share on other sites

eu nu stiu python :P

Am observat ca grupurile de 9 cifre au una lipsa. Grupurile de 10 le-am considerat separatori. (despartind in grupuri de 9 incep sa se formeze cele de 10 cand se repeta cifre).

Asa am observat ceva comun: sunt 2 sau 3 grupuri de 9 cifre, urmat de unul de 10. Daca sunt 3 grupuri, din primul lipseste cifra 1

Concluzie: cifrele lipsa din grupurile de 9 iti dau un cod ascii.

864321059 lipseste 7 :F=70

824973165 lipseste 0

3976415802

306578492 lipseste 1 :e=101

789653214 lipseste 0

965248037 lipseste 1

6152308497

576309248 lipseste 1 :l=108

713248965 lipseste 0

569124703 lipseste 8

......

Functia mea srcch($s) returneaza cifra lipsa dintr-un sir de cifre. Intotdeauna ii dau 9 cifre.

$sute e un sir care ia primul grup de cifre. Daca lipseste 1 atunci sunt 3 grupuri de 9 (logica: ai folosit coduri ascii gen 1xx sau yy iar yy niciodata nu va fi 1y ci va fi >31). In cazul acesta am adaugat 100 si am sarit 9 cifre.

In continuare procesez normal celelalte 2 grupuri, adaug suta daca e nevoie. Apoi sar cele 10 cifre (28=9+9+10) pentru urmatorul cod ascii.

Note php: la if(!strstr($s."x",$i.'')) return $i; am pus "x" ca nu mergea, nu's de ce iar $i.'' e pentru conversie la string. Nu imi mai aduc eu aminte php.

Edited by loki
Link to comment
Share on other sites

Da ... pachetele de 10 cifre sunt folosite ca separator iar cele de 9 le lipeste o cifra care contribuie la valoarea decimala ascii pentru fiecare caracter din string-ul final. Faza e ca decat sa te complici atat puteai sa iei mereu primele 10 caractere si vedeai daca al 10-lea caracter se repeta in primele 9. Daca se repeta e clar ca e un pachet de 9 si vedeai cifra lipsa care o adaugai intr-o variabila, dar daca nu se repeta era clar ca e un pachet de 10 cifre distincte si in loc sa adaugi vreo cifra la variabila adaugai un separator. Si dupa fiecare pachet de 9 sau 10 cifre analizat taiai pachetul, adica primele 9 sau 10 cifre ... depinde de lungimea pachetului descoperit de tine. Si apoi faceai conversia si gata mesajul. Am avut grija in algoritmul pentru codare de eventualele bug-uri cum ar fi:

Dupa un pachet de 9 urmatorul pachet sa nu inceapa niciodata cu cifra care ii lipsea pachetului anterior, deoarece pachetul de 9 avand imediat dupa el cifra lipsa devine pachet de 10 si se strica tot, iar faza misto a "librarii" este ca de fiecare data pentru acelasi string se genereaza un cod complet diferit, ramanand la fel doar lungimea :P. Oricum te-ai prins .. gJ :)), v-am zis ca era usor.

Link to comment
Share on other sites

Dupa un pachet de 9 urmatorul pachet sa nu inceapa niciodata cu cifra care ii lipsea pachetului anterior, deoarece pachetul de 9 avand imediat dupa el cifra lipsa devine pachet de 10 si se strica tot,

eh, nu stiam si am prevenit situatia asta :)

Link to comment
Share on other sites

Nuuu...chiar ma gandeam ca o sa fiu primu care rezolva...

Oricum...l-am facut si eu in C++. Mi-am dat seama de faza azi noapte pe la 4 dar am zis ca o termin azi...

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char sir[]="8643210598249731653976415802306578492789653214965248037615230849757630924871324896556912470319863472059570826436829143571790468238473296150765823104812643057620814573975042936856372491824916078370915348265697428308275640939748215033910854267783042615295013468953208147635670289467284530967938012564178530927983642057418935266078214933149028765176249085215807694756813429061728054960851394791560374284371825909380264179641207358758290634428371659892376410728046913582917640501487936518726594307253480690524837969520348174692570831326480759768304529508196273641895230773942608584513296759470238603452167895620147833427601585781320694023947856594680372592631048359124608739027865476245890394120875305479168328654097126758103496970532814742036598514867329693751248702513648928503479686942137558739620487154293608920761546801534790183647529627530948865037429380561947963501742872864593093586740226309158734150982673752984064759862132984307619568321047930826754589643127805412367043729651805689472387059324698436150240976528138253074965921784635327409614807631295892641570145063987951842037627346905885643209763549172867485392100625498734169528379347806210746932581796032458278643950902147536453978061245069372837146985275609248334061879255879423609826314579731420654398105276763085291892517340042186579327409165875980613483471692507642013597935164829315820476385176402534098216429805673170354296836029574885106729313827650492436705986038594722897056348136572490453269078872954163912745063562047913884015763252134906853742096816725890416901857348657104293746952380342598706618403597358910674237456802936724981552409738646731509280687925434720983565378619247031492865245309687982340567573084129912758406379450326846298357090137856289642135075364807292890647350286135498690312574480975216640359178530764128976342081548093256118962740535174806920346581797231645809602359874579431268412697538264378159093428570646918257342630987530249875610378516424123670593246570918964582370621743859923471506261074385920356978437295084645093678289320164573172856400253716845321407698413705286083512694923876041578956410217365984095846720315648027394903872655692418303490127865938624075862075349982763401723586410976812403586041359261452893076254870917594683013470269581293768450675142839290683475601754829397632548032476850939486721090587216347098354627549026833782941059250137648396547820763152849293078645248051739630687912473425906175816029344962587108641973501438027956037524196927386451430915276808432576163905281483401972658250967434251687392518367947681542390285419360092715438514309286703964287542896750374308256951926470838125463707043562188690421735243758609827354196138924650019368752417805296376152048347205319866270894316859471029542083671743168920984502317890236417568701243926408915792385074612187603490739254687190463258";
int n=strlen(sir),i,j,s=0,k=0,l,ok1,var1=0,nr=0,ok=0;
while(k<=n)
{ok1=0;
for(j=0;j<=9;j++)
{s=0;
ok1=0;
for(i=k;i<=k+9;i++)
{if(sir[i]-'0'==j)
s++;
}
if(s>1)
{ok1=1;ok=1; }
if(s==0)
nr=nr*10+j;
}
if(ok==0)
{ cout<<(char)nr;
nr=0;
k=k+10;
}
else k=k+9;ok=0;
}
return 0;

Felicitari! Ai trecut de primul nivel. Parola pentru a debloca usa este: PadLock15853

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...