본문 바로가기

Reversing14

[Dreamhack] rev-basic-7 문제에서 주어진 파일을 IDA Pro7.5로 실행한다. Correct를 출력하기 위해 check 함수에 들어간다. 입력할 문자열을 input[i], 140003000에 저장된 문자열을 buf[i]라고 가정하면 if문의 조건이 거짓이 되기 위해서 아래와 같은 식이 만족해야한다. i xor rol(input[i] , (i and 7) ) = buf[i] 해당 식의 양쪽에 xor i를 해주고 (i and 7) 만큼 ror 해주면 아래와 같은 식이 된다. input[i] = ror(i xor buf[i] , i and 7) 더 풀어서 식을 정리하면 아래와 같이 정리할 수 있다. input[i] = ((i xor buf[i]) >> (i and 7)) + ((i xor buf[i]) > j; tmp2 = fx[i] 2021. 3. 30.
[Dreamhack] rev-basic-5 문제에서 주어진 실행파일을 IDA Pro7.5에서 실행하면 위 그림과 같이 sub_140001000 함수 결과가 참이 나오면 Correct가 출력된다. return 1을 반환하기 위해서는 조건문이 거짓이 되어야 하므로 입력할 문자열을 input이라고 하고 140003000에 저장된 문자열을 buf라고 가정하면 input[i+1]+input[i]=buf[i]가 되어야한다. input[i]를 구하기 위해서 식을 변형하면 아래 식과 같이 규칙이 존재한다. input[0]-input[24]=buf[0]-buf[1]+buf[2]-buf[3]+...-buf[23] input[1]+input[24]=buf[1]-buf[2]+buf[3]-buf[4]+...+buf[23] 중요한점은 입력할 문자열의 마지막은 널 바이트이.. 2021. 3. 30.
[Dreamhack] rev-basic-4 int __cdecl main(int argc, const char **argv, const char **envp) { char v4[256]; // [rsp+20h] [rbp-118h] BYREF memset(v4, 0, sizeof(v4)); sub_1400011C0("Input : ", argv, envp); sub_140001220("%256s", v4); if ( (unsigned int)sub_140001000((__int64)v4) ) puts("Correct"); else puts("Wrong"); return 0; } IDA Pro7.5를 이용해 디스어셈블하면 위와 같은 코드를 볼 수 있다. Correct 바로 위의 if 조건문이 참이면 Correct를 출력한다. __int64 __fas.. 2021. 3. 30.
[Dreamhack] rev-basic-3 문제 파일을 다운로드 받고 IDA Pro 7.5를 실행하면 위 그림과 같이 디스어셈블할 수 있다. Correct를 출력하기 쉬해서는 sub_140001000(v4) 함수가 참을 반환해야 Correct가 출력된다. sub_140001000 함수로 들어가서 코드를 분석하겠다. for ( i = 0; (unsigned __int64)i 24번 반복한다. if ( byte_140003000[i] != (i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i ) return 0i64; byte_140003000[i] 과 ((i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i )가 같으면 if 문이 거짓이 되어 return 0; 을 실행하지 .. 2021. 3. 30.
[Dreamhack] rev-basic-0 문제 파일을 x64dbg 디버거로 열어준다. main 함수를 찾기 위해 메뉴에 빨간 네모 안에 있는 Az 메뉴를 클릭한다. "Input :" 문자열을 클릭하여 main 함수를 찾아준다. main 함수는 다음과 같다. push rdi로 스택에 복귀 주소를 저장하고 sub rsp,130으로 0x130만큼의 공간을 할당하고 main 함수가 시작된다. 문제의 핵심은 00007FF6321D112C 주소에서 호출하는 chall0.7FF6321D1000 함수이다. 해당 함수가 0을 반환하면 7FF6321D1166으로 점프하여 Wrong을 반환하고 다른 값을 반환하면 Correct를 반환한다. 따라서 해당 함수가 참을 반환해야 한다. 해당 함수로 들어가면 위 그림과 같은 어셈블리어가 출력된다. mov qword ptr.. 2021. 3. 24.