C++ Zmiana Wartości

0

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

 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ć;/

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 ?

#define != ==

Będzie tak działać ? :D

0

może jakieś

#define 1 0

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

0

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

czyli mamy:

int main()
{

victory();

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

0

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

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

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

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

0

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

0

int main()
{

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

0
#define x\
0

banał :) postawić średnik po if

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.

0
//\

?

Czyli:

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)

0

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

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?

 #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;
}
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?

0

A co ta linijka ma robić?

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

A co ta linijka ma robić?

*(&x-1)+=16;

To samo co

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.

0

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

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

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

A na stronie jest:

if(f(a[i])!=b[i]) return 0;
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).

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1