Title here
Summary here
July 4, 20252 minutes
#include <stdio.h>
#include <stdlib.h>
static int addIntOvf(int result, int a, int b) {
result = a + b;
if(a > 0 && b > 0 && result < 0)
return -1;
if(a < 0 && b < 0 && result > 0)
return -1;
return 0;
}
int main() {
int num1, num2, sum;
FILE *flag;
char c;
printf("n1 > n1 + n2 OR n2 > n1 + n2 \n");
fflush(stdout);
printf("What two positive numbers can make this possible: \n");
fflush(stdout);
if (scanf("%d", &num1) && scanf("%d", &num2)) {
printf("You entered %d and %d\n", num1, num2);
fflush(stdout);
sum = num1 + num2;
if (addIntOvf(sum, num1, num2) == 0) {
printf("No overflow\n");
fflush(stdout);
exit(0);
} else if (addIntOvf(sum, num1, num2) == -1) {
printf("You have an integer overflow\n");
fflush(stdout);
}
if (num1 > 0 || num2 > 0) {
flag = fopen("flag.txt","r");
if(flag == NULL){
printf("flag not found: please run this on the server\n");
fflush(stdout);
exit(0);
}
char buf[60];
fgets(buf, 59, flag);
printf("YOUR FLAG IS: %s\n", buf);
fflush(stdout);
exit(0);
}
}
return 0;
}
Necesitamos dos números que cumplan esto
result = a + b;
if(a > 0 && b > 0 && result < 0)
A y B tienen que ser mayor que 0, pero el resultado de su suma tiene que dar un número menor a 0, esto es imposible matemáticamente.
num1, num2 y sum están declarados como int, lo que significa que ocupan 32 bits
INT_MIN -2147483648
BIN: 1 0000000000000000000000000000000 len: 31 + 1
DECI: - 2147483648
INT_MAX +2147483647
BIN: 0 1111111111111111111111111111111 len: 31 + 1
DECI: + 2147483647
2147483647 es el máximo número positivo, pero si se le suma 1 da -2147483648.
Así que tenemos 2 números positivos qué sumados dan uno menor a 0
nc saturn.picoctf.net 59101
n1 > n1 + n2 OR n2 > n1 + n2
What two positive numbers can make this possible:
2147483647 1
You entered 2147483647 and 1
You have an integer overflow
YOUR FLAG IS: