Reversing.kr Position 문제 입니다.
알맞은 Name값과 Serial 값을 입력하면 풀리는 문제같네요.
ReadMe 를 읽어보니 찾는 Name의 Serial 값은 76876-77776 이며 답은 여러개가 있을수 있다고 하네요
Name의 마지막 글자는 p이고 Name의 글자수는 4글자라고 힌트를 줍니다.
올리디버거로 문제를 분석해본 결과 Correct 문과 Wrong 문 위에 있는 CALL문에서 연산코드가 진행된다는 것을 알수있었습니다.
첫번째 루프를 보니 Name값들이 a~z 범위 안인지 확인합니다.
두번째 루프를 확인해보니 Name 값들의 중복이 없는지 확인합니다.
세번째 비교 구문을 보니 Serial 글자수가 총 11글자 이며 Serial 가운데 문자가 ' - ' 인지 확인합니다.
그다음 코드는 워낙 길어서 IDA로 분석하였습니다.
코드를 요약해보자면 Name값이랑 >>, &,+ 등을 하여 나온 값들과 Serial 각 자리숫자들과 비교합니다.
Shift연산, AND연산, ADD연산 때문에 Name값이 여러개가 생길수 있습니다
후에 간단하게 Name값을 Brute Force 해주었습니다.
[ Brute Force code ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include <stdio.h> int main() { int a[10] = { 7,6,8,7,6,7,7,7,7,6 }; int b[4] = { 0, }; int count = 0; int i, j, k; for (i = 97; i <= 122; i++) { int v8 = (i & 1) + 5; int v59 = ((i >> 4) & 1) + 5; int v53 = ((i >> 1) & 1) + 5; int v55 = ((i >> 2) & 1) + 5; int v57 = ((i >> 3) & 1) + 5; for (j = 97; j <= 122; j++) { int v45 = (j & 1) + 1; int v51 = ((j >> 4) & 1) + 1; int v47 = ((j >> 1) & 1) + 1; int v10 = ((j >> 2) & 1) + 1; int v49 = ((j >> 3) & 1) + 1; if (v8 + v10 == a[0]) { if (v57 + v49 == a[1]) { if (v53 + v51 == a[2]) { if (v55 + v45 == a[3]) { if (v59 + v47 == a[4]) { if (i != j&&i != 112 && j != 112) { b[0] = i; b[1] = j; count++; } } } } } } } if (count == 1) { for (k = 97; k <= 122; k++) { int v27 = (k & 1) + 5; int v60 = ((k >> 4) & 1) + 5; int v54 = ((k >> 1) & 1) + 5; int v56 = ((k >> 2) & 1) + 5; int v58 = ((k >> 3) & 1) + 5; int v46 = (112 & 1) + 1; int v52 = ((112 >> 4) & 1) + 1; int v48 = ((112 >> 1) & 1) + 1; int v29 = ((112 >> 2) & 1) + 1; int v50 = ((112 >> 3) & 1) + 1; if (v27 + v29 == a[5]) { if (v58 + v50 == a[6]) { if (v54 + v52 == a[7]) { if (v56 + v46 == a[8]) { if (v60 + v48 == a[9]) { if (i != k&&j != k &&k != 112) { b[2] = k; b[3] = 112; printf("%c%c%c%c\n", b[0], b[1], b[2], b[3]); } } } } } } } count--; } } } | cs |
코드가 너무 지저분하다..
총 3개의 Name값들이 나오게 됩니다.
하지만 이상하게도 3개의 Name값들중 가장 첫번째 값만 Reversing.kr auth 답으로 인정하네요..
'Wargame > ▷ Reversing.kr' 카테고리의 다른 글
[Reversing.kr] Multiplicative (0) | 2018.01.12 |
---|---|
[Reversing.kr] WindowsKernel (0) | 2018.01.12 |
[Reversing.kr] Twist1 (0) | 2018.01.08 |
[Reversing.kr] Flash Encrypt (0) | 2018.01.08 |
[Reversing.kr] HateIntel (0) | 2017.12.30 |