C++ Zmiana Wartości

C++ Zmiana Wartości
0

Witam mam pewne zadanie ale za chiny nie wiem jak je rozwiązać;/ oto kod

Kopiuj
 int main()
{
  
 // Tu możemy napisać swój kod do 10 znaków
  if(1337!=1337) 
    victory();
  return 0;
}

Zadanie polega na wywołaniu victory(); ale ja zmienić wartość 1337? można dodać tylko 10znkaów swego kodu i tylko w tym miejscu co jest w kodzie zaznaczone do tego nie można używać : " asm " , " ( " , " &" , " /" , " * " . Siedzę przy tym dobre parę Godzin i nie mogę rozwiązać;/

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Zapomniałeś dodać, że nie można używać także "victory();" oraz, że do dyspozycji ma się jeden średnik :D
http://krzaq.pastebin.com/HWDZQpyn

Może tak ?

Kopiuj
#define != ==

Będzie tak działać ? :D


edytowany 4x, ostatnio: Patryk27
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

może jakieś

Kopiuj
#define 1 0

? ale to 11 znaków ;]
(oczywiście tak się nie da zrobić define, chodzi mi raczej o koncepcje)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Gregory_Scot
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 14 lat
  • Postów:91
0

Skoro tylko 10 znaków to : victory(); :)

czyli mamy:

int main()
{

victory();

if(1337!=1337)
victory();
return 0;
}


Patryk27
Technicznie...
deus
Przeczytaj treść zadania ze zrozumieniem, nie wolno użyć victory ani ().
deus
  • Rejestracja:około 21 lat
  • Ostatnio:ponad 12 lat
0

Nie takie jest oczekiwane rozwiązanie, ale działa:

Kopiuj
int main()
{
#define z\
  if(1337!=1337) 
    victory();
  return 0;
}

I nie udawaj, że rozumiesz.
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A czy da się na przykład zrobić goto do jakiegoś miejsca które nie jest oznaczone etykietą?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
deus
Na poziomie maszynowym tak, i w sumie chyba o to w zadaniu chodzi. Średnio jednak mam pomysł na odpalenie tego bez '('.
Shalom
Pewnie tak, bo z tego co widzę tutaj: http://securitytraps.no-ip.pl/challs/cpptrap1/ twoje rozwiązanie nie przejdzie ;)
deus
#define false 1
Shalom
aaa no tak, tam jest ==false ;] myślałem że to taki sam przykład jak z tym 1337, tylko w jednej linii
0

:D Dzięki Ale zadania i tak nie rozwiążę bo sam go nie rozwiązałem;)

http://securitytraps.no-ip.pl/challs/cpptrap10/

i Jeszcze to nie daje mi spokoju Proszę o małą podpowiedź;) Nie rozwiązanie

deus
  • Rejestracja:około 21 lat
  • Ostatnio:ponad 12 lat
0

To akurat jest banalne, deklaracje mogą być przesłaniane w lokalnym scope.


I nie udawaj, że rozumiesz.
XK
  • Rejestracja:ponad 16 lat
  • Ostatnio:około rok
0

int main()
{

//
if(1337!=1337)
victory();
return 0;
}

MA
Nie możesz stosować /
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 2 godziny
0
Kopiuj
#define x\
0

banał :) postawić średnik po if

deus
Widzę, że tutaj wszyscy mają problemy z czytaniem ze zrozumieniem...
0

A tak na serio, było takie coś dla programistów, że zastępuje się znaki innymi jak ktoś nie ma owych na klawiaturze. Kod wtedy nie czytelny, ale kompiluje się i działa jak należy. Nie wiem czy to to.

Azarien
Nie to. To znaczy, nie da się zastosować przy takich warunkach zadania. Sprawdzałem.
Xupicor
  • Rejestracja:prawie 17 lat
  • Ostatnio:ponad 8 lat
0
Kopiuj
//\

?

Czyli:

Kopiuj
int main()
{
  //\
  if(1337!=1337) 
    victory();
  return 0;
}

edit:
A mogłem poczytać lepiej komentarze, a nie się meczyć. ;) deus do tego zadania z 1337 pierwszy podał rozwiązanie, sam chwilkę nad nim myślałem. #define f\ (zamiast f jakakolwiek litera)


edytowany 3x, ostatnio: Xupicor
msm
[`do tego nie można używać : " asm " , " ( " , " &" , " /" , " * " ."]... \n\ Do tego ktoś już na to przed tobą wpadł...
Xupicor
A no tak, jakoś rozwiązanie xkpit przeoczyłem. :) Poza tym, mówimy o tym zadaniu tutaj, czy podlinkowanym, bo to dwie różne rzeczy. ;) To podlinkowane to #define false 1
0

A czy nie macie może jakiś stron z toutrialami ? do takich HackMe jak te itd?

msm
Administrator
  • Rejestracja:około 16 lat
  • Ostatnio:6 miesięcy
0
edytowany 1x, ostatnio: msm
0

Próbowałem zrobić takie rozwiązanie do zadania 5. U mnie na x86 i gcc 4.4.5 bez optymalizacji działa, ale na stronie nie. Czy jest to dobra droga?

Kopiuj
 #include <iostream>
using namespace std;
void dummy(){
cout<<"ok";}

int f(int x){
	
	*(&x-1)+=16;
}
int main(){
	int a[3]={0,1,2};
	int b[3]={2,3,4};
	for (int i=0; i<3; i++){
		if (f(a[i]!=b[i])) return 0;
	}
	dummy();
	return 0;
}
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 2 godziny
0

co to znaczy „nie działa”?

0

Tzn. po wpisaniu tej linii nie wywołuje funkcji victory() w zadaniu: http://securitytraps.no-ip.pl/challs/cpptrap5/. Wiem, że to jest daleki strzał (pośrednia modyfikacja PC), ale była szansa, że zadziała.

0

Regulamin ST:

  • Pracuj samodzielnie.
    ...

Nie umiemy czytać? hm?

MA
Ja sie zatrzymalem na R
0

A co ta linijka ma robić?

Kopiuj
*(&x-1)+=16;
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 2 godziny
0

A co ta linijka ma robić?

Kopiuj
*(&x-1)+=16;

To samo co

Kopiuj
int *p = &x;
p = p - 1;
(*p) = (*p) + 16;

czyli grzebie gdzieś po stosie, na szczęście w architekturze x86 — będzie to wolny kawałek stosu.

edytowany 1x, ostatnio: Azarien
deus
"będzie to wolny kawałek stosu", bezedura. Stos się cofa przy wrzucaniu, po wrzuceniu pierwszego argumentu (w większości konwencji idą odwrotnie) następne miejsce (czyli -1 element) zajmuje adres powrotu z wywołania funkcji...
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około godziny
0

A ja myślę, że ta instrukcja ma, w zamierzeniu autora, modyfikować adres powrotny z procedury.

Zjarek, źle przepisałeś kod. Ty masz:

Kopiuj
if (f(a[i]!=b[i])) return 0;

A na stronie jest:

Kopiuj
if(f(a[i])!=b[i]) return 0;

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 2 godziny
0

A ja myślę, że ta instrukcja ma, w zamierzeniu autora, modyfikować adres powrotny z procedury.
To niemądry pomysł, ale i tak tam nie ma adresu powrotnego ;-)

0
Azarien napisał(a)

To niemądry pomysł, ale i tak tam nie ma adresu powrotnego ;-)

Z pierwszą częścią tego zdania zgadzam się w 100%, druga jest nie prawdziwa dla x86. Po pierwsze stos jest liczony w dół. W trakcie wywoływania funkcji na stos wrzucane są parametry, a następnie adres powrotny. Tutaj odwołuje się do kolejnego elementu stosu (przesunięcie 4 bajtowe) względem jedynego parametru, czyli właśnie do adresu powrotnego (na potwierdzenie tego wcześniej przytoczony program wypisuje u mnie ok, ale tylko przy liczbie 16 w drugiej części polecenia).
Jest to chyba jednak złe rozwiązanie tego zadania, bo dla praktycznie rzadnych parametrow nie udało mi się uzyskać pozytywnej odpowiedzi serwera, mimo uwzględnienia w testowaniu błędu słusznie wytkniętego przez Wibowita. Może jest to kompilowane na 64 bitach (nie wiem czy wtedy moje założenie o adresach jest słuszne, bo o ile dobrze pamiętam to pierwsze parametry funkcji w architekturze x86-64 przekazywane są w rejestrach).

msm
Administrator
  • Rejestracja:około 16 lat
  • Ostatnio:6 miesięcy
0

W trakcie wywoływania funkcji na stos wrzucane są parametry, a następnie adres powrotny. Tutaj odwołuje się do kolejnego elementu stosu (przesunięcie 4 bajtowe) względem jedynego parametru, czyli właśnie do adresu powrotnego (na potwierdzenie tego wcześniej przytoczony program wypisuje u mnie ok, ale tylko przy liczbie 16 w drugiej części polecenia).
Jest to chyba jednak złe rozwiązanie tego zadania, bo dla praktycznie rzadnych parametrow nie udało mi się uzyskać pozytywnej odpowiedzi serwera, mimo uwzględnienia w testowaniu błędu słusznie wytkniętego przez Wibowita. Może jest to kompilowane na 64 bitach (nie wiem czy wtedy moje założenie o adresach jest słuszne, bo o ile dobrze pamiętam to pierwsze parametry funkcji w architekturze x86-64 przekazywane są w rejestrach).
Parametry funkcji mogą być przekazywane w dowolny sposób jak sobie kompilator/użytkownik zażyczy, np. BCB używa namiętnie fastcalla czyli tego przekazywania przez rejestry które uważasz za domenę 64 bitów, VS przekazuje parametr this przez rejestr ecx (thiscall)... Technicznie nawet przekazywanie adresu powrotu w rejestrze jest jak najbardziej możliwe.

edytowany 9x, ostatnio: msm

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.