picoCTF 2019 flag_shop - Points: 300

3406 단어 picoCTFCTF

문제





풀어 보았다.



소스를 살펴보겠습니다.
조금 길기 때문에 키모가되는 부분을 발췌합니다.
우선은 flag를 표시하는 처리의 곳.



소스를 보는 한
if(account_balance > 100000){

를 만족하면 flag가 표시될 것 같습니다.
account_balance에 대해 알아보겠습니다.



정의 단계에서는 1100이 들어 있습니다.



행 42에서 account_balance의 값을 다시 쓰는 프로세스가 있으므로 여기에 어떻게 든 노력하는 문제 인 것 같습니다.
account_balance = account_balance - total_cost;

계산 후 account_balance가 100000보다 큰 값이되면 좋기 때문에
1100 - total_cost > 100000
total_cost < - 98900

가 되도록 total_cost가 되면 좋을 것입니다.
total_cost는 어디에서 다시 작성됩니까?



거의 아까와 같은 곳에서 처리되고 있는 것 같습니다.
int total_cost = 0;
total_cost = 900*number_flags;

number_flags는 36행에 입력한 숫자를 포함합니다.
그래서 number_flags에 큰 마이너스 값을 입력하면 좋을 것 같습니다만, 37행째로 >0이 있으므로 정수여야 합니다.

확실히 int의 구조를 생각하면 최대치를 넘으면 자리수 넘치는 것이 최소치에 가 버릴 것입니다.
∵ 맨 위의 겉은 부호를 판단하기 위한 자리이므로, 자리수 넘치고 1이 되어 1은 마이너스를 나타내기 때문에.

int의 최대치에 대해 조사합니다.

데이터 유형의 최대값 확인 - Qiita
htps : // m / hryshtk / ms / b848 d3bd78f940 a c5 a f



최대값은 2147483647입니다.
시험에이 최대 값을 입력하여 어떻게되는지 확인해보십시오.



-900이 되었습니다. 정책은 이것으로 그렇습니다.

지금하고 싶은 것은 total_cost <- 98900을 충족시키고 싶습니다.
이를 위해
-98900 > 900*number_flags
-109 > number_flags

가 되는 number_flags로 한다.
2147483647+100=2147483747을 설정하면 좋을까요?
라고 생각하면 왠지 버그는 안 되었습니다.

조금 혼란 스러웠습니다.
반대로 당기는 것인가?
2147483647-100=2147483547로 시도해 보세요.



오, 당기는 것이 정답 같아.
2147483647-1000=2147482647라든지 하면 골 할 수 있는가.



할 수 있었다.

좋은 웹페이지 즐겨찾기