ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LIT] addition
    CTF/rev 2022. 7. 25. 15:54

    source code

    addition이라는 문제이다. 12번째 줄에서 덧셈을 하는 모습이 보인다.

    v7에 입력을 받고, v5에서는 어떤 값들을 두 개를 더한 뒤, v5와 v7에 입력한 값을 하나씩 비교를 한다.

     

    dword_4060과 dword_40c0에 뭐가있는지 우선 알아야겠다.

     

    in hex

    dword_4060, dword_40c0에는 24개의 숫자가 들어있다.

    16진수는 보기 불편하니 10진수로 바꿔보자

     

    in decimal

    ??

    42억이 넘는 숫자가 보인다.

     

    다시 소스코드를 봐보자

    main에서 dword_40c0[i]만큼 떨어져 있는 주소의 값과 dword_4060[i]의 값과 더한 후, 입력값과 비교한다.

    그렇다면 main주소의 값들도 알아야 한다.

     

    main

    main 함수 부분을 hex로 본 것이다. 저기 있는 값들도 가져와야한다.

     

    그렇다면 이제 생각해봐야 할 부분은 42억이 넘는 수를 입력값과 비교를 할 수가 없겠지만, c언어에는 오버플로우라는 개념이 있다. 어떤 자료형의 범위가 0~100일 때, 100이 넘는 수가 할당이 되면 100을 넘어 0부터 다시 시작하게 된다.

    int의 범위는 약 -21억 ~ 21억이고 unsigned int의 범위는 약 0 ~ 42억이다

     

    값을 가져올 때 unsigned int로 가져오면 42억이 넘는 수여서 오버플로우가 날 것이고 그렇다면 생각보다 많이 작은 수가 될 것이고 그 수에 해당하는 아스키코드 값을 출력시키면 될 것이다.

     

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    
    int main() {
        unsigned int stack[] = {
            0x53, 0x48, 0x8D, 0x3D, 0x8C, 0x0F, 0x00, 0x00, 0x31, 0xC0, 0x48, 0x83, 0xEC, 0x20, 0x48, 0x89,
            0xE3, 0x48, 0x89, 0xDE, 0xE8, 0xC7, 0xFF, 0xFF, 0xFF, 0x31, 0xC0, 0x48, 0x8D, 0x0D, 0x2E, 0x30,
            0x00, 0x00, 0x4C, 0x8D, 0x05, 0xD7, 0xFF, 0xFF, 0xFF, 0x48, 0x8D, 0x3D, 0xC0, 0x2F, 0x00, 0x00,
            0xEB, 0x10, 0x66, 0x0F, 0x1F, 0x44, 0x00, 0x00, 0x48, 0x83, 0xC0, 0x01, 0x48, 0x83, 0xF8, 0x18,
            0x74, 0x2B, 0x48, 0x63, 0x14, 0x81, 0x0F, 0xBE, 0x34, 0x03, 0x41, 0x0F, 0xB6, 0x14, 0x10, 0x03,
            0x14, 0x87, 0x89, 0x14, 0x81, 0x39, 0xF2, 0x74, 0xDF, 0x48, 0x8D, 0x3D, 0x39, 0x0F, 0x00, 0x00,
            0xE8, 0x6B, 0xFF, 0xFF, 0xFF, 0x48, 0x83, 0xC4, 0x20, 0x31, 0xC0, 0x5B, 0xC3, 0x48, 0x8D, 0x3D,
            0x2B, 0x0F, 0x00, 0x00, 0xE8, 0x57, 0xFF, 0xFF, 0xFF, 0xEB, 0xEA, 0x0F, 0x1F, 0x44, 0x00, 0x00
        };
    
        unsigned int dword_4060[] = { 15, 73, 4294967243, 4294967222, 12, 22, 51, 4294967138, 100, 28, 4294967163, 44, 4294967166, 4294967253, 38, 95, 105, 4294967219, 95, 32, 4294967208, 71, 97, 4294967166 };
        int dword_40c0[] = {43, 94, 18, 90, 89, 31, 1, 100, 46, 14, 76, 10, 121, 107, 89, 115, 46, 58, 95, 109, 4, 112, 73, 39 };
    
    
        char tmp;
        for (int i = 0; i < 24; i++) {
            tmp = stack[dword_40c0[i]] + dword_4060[i];
            printf("%c", tmp);
        }
    
        
    }

     

    위처럼 코드를 짰다.

     

    플래그가 나왔다!

    댓글

Hi