two-sum


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: