picoCTF 2019 flag_shop - Points: 300
문제
풀어 보았다.
소스를 살펴보겠습니다.
조금 길기 때문에 키모가되는 부분을 발췌합니다.
우선은 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라든지 하면 골 할 수 있는가.
할 수 있었다.
Reference
이 문제에 관하여(picoCTF 2019 flag_shop - Points: 300), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/samohan/items/37330570b4f3d16300a1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
소스를 살펴보겠습니다.
조금 길기 때문에 키모가되는 부분을 발췌합니다.
우선은 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라든지 하면 골 할 수 있는가.
할 수 있었다.
Reference
이 문제에 관하여(picoCTF 2019 flag_shop - Points: 300), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/samohan/items/37330570b4f3d16300a1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)