|
| 1 | +# Cave system (easy) |
| 2 | +In this challenge a bunch of condition are checked against the user input. |
| 3 | +The user input is the flag itself. |
| 4 | + |
| 5 | +```c |
| 6 | + fgets(local_88,0x80,stdin); |
| 7 | + iVar1 = memcmp(local_88,&DAT_00102033,4); |
| 8 | + if (((((((iVar1 == 0) && ((char)(local_88[21] * local_88[48]) == '\x14')) && |
| 9 | + ((char)(local_88[32] - local_88[36]) == -6)) && |
| 10 | + (((((((char)(local_88[37] - local_88[26]) == -0x2a && |
| 11 | + ((char)(local_88[16] - local_88[48]) == '\b')) && |
| 12 | + (((char)(local_88[55] - local_88[8]) == -0x2b && |
| 13 | + (((char)(local_88[26] * local_88[7]) == -0x13 && |
| 14 | + ((char)(local_88[4] * local_88[24]) == -0x38)))))) && |
| 15 | + ((byte)(local_88[34] ^ local_88[28]) == 0x55)) && |
| 16 | + (((((char)(local_88[30] - local_88[55]) == '4' && |
| 17 | + ((char)(local_88[59] + local_88[50]) == -0x71)) && |
| 18 | + ((char)(local_88[44] + local_88[27]) == -0x2a)) && |
| 19 | + (((byte)(local_88[17] ^ local_88[14]) == 0x31 && |
| 20 | + ((char)(local_88[56] * local_88[20]) == -0x54)))))) && |
| 21 | + (((((char)(local_88[58] - local_88[26]) == -0x3e && |
| 22 | + (((byte)(local_88[26] ^ local_88[6]) == 0x2f && |
| 23 | + ((byte)(local_88[14] ^ local_88[39]) == 0x5a)))) && |
| 24 | + ((byte)(local_88[44] ^ local_88[39]) == 0x40)) && |
| 25 | + (((((local_88[40] == local_88[26] && ((char)(local_88[23] + local_88[49]) == -0x68)) && |
| 26 | + ((char)(local_88[23] * local_88[59]) == 'h')) && |
| 27 | + (((char)(local_88[1] - local_88[28]) == -0x25 && |
| 28 | + ((char)(local_88[24] - local_88[29]) == -0x2e)))) && |
| 29 | + (((char)(local_88[38] - local_88[24]) == '.' && |
| 30 | + (((byte)(local_88[32] ^ local_88[22]) == 0x1a && |
| 31 | + ((char)(local_88[44] * local_88[4]) == -0x60)))))))))))) && |
| 32 | + ((((((char)(local_88[38] * local_88[27]) == '^' && |
| 33 | + ((((char)(local_88[15] - local_88[40]) == -0x38 && |
| 34 | + ((byte)(local_88[49] ^ local_88[53]) == 0x56)) && |
| 35 | + ((byte)(local_88[26] ^ local_88[45]) == 0x2b)))) && |
| 36 | + ((((((byte)(local_88[54] ^ local_88[9]) == 0x19 && |
| 37 | + ((char)(local_88[28] - local_88[47]) == '\x1a')) && |
| 38 | + (((char)(local_88[50] + local_88[19]) == -0x5f && |
| 39 | + (((char)(local_88[37] + local_88[57]) == 'V' && |
| 40 | + ((byte)(local_88[29] ^ local_88[18]) == 0x38)))))) && |
| 41 | + ((byte)(local_88[44] ^ local_88[60]) == 9)) && |
| 42 | + ((((((char)(local_88[15] * local_88[38]) == 'y' && |
| 43 | + ((byte)(local_88[37] ^ local_88[30]) == 0x5d)) && |
| 44 | + ((char)(local_88[2] * local_88[32]) == '\\')) && |
| 45 | + (((char)(local_88[10] * local_88[18]) == '9' && (local_88[29] == local_88[21])))) && |
| 46 | + (((char)(local_88[35] * local_88[21]) == '/' && |
| 47 | + (((char)(local_88[8] * local_88[37]) == -0x55 && |
| 48 | + ((char)(local_88[39] + local_88[26]) == -0x6d)))))))))) && |
| 49 | + (((((((byte)(local_88[26] ^ local_88[34]) == 0x73 && |
| 50 | + ((((byte)(local_88[20] ^ local_88[31]) == 0x40 && |
| 51 | + ((char)(local_88[25] + local_88[16]) == -0x57)) && |
| 52 | + ((byte)(local_88[39] ^ local_88[59]) == 0x15)))) && |
| 53 | + ((((char)(local_88[0] + local_88[59]) == 'i' && |
| 54 | + ((char)(local_88[34] + local_88[46]) == -0x5b)) && |
| 55 | + (((byte)(local_88[30] ^ local_88[52]) == 0x37 && |
| 56 | + (((char)(local_88[0] * local_88[28]) == '\b' && |
| 57 | + ((char)(local_88[34] - local_88[56]) == -0x3b)))))))) && |
| 58 | + ((char)(local_88[18] + local_88[60]) == -0x1c)) && |
| 59 | + (((((byte)(local_88[35] ^ local_88[40]) == 0x6e && |
| 60 | + ((char)(local_88[56] * local_88[16]) == -0x54)) && |
| 61 | + ((char)(local_88[54] - local_88[47]) == '\r')) && |
| 62 | + ((((char)(local_88[30] + local_88[55]) == -100 && |
| 63 | + ((char)(local_88[6] + local_88[33]) == -0x2c)) && |
| 64 | + (((char)(local_88[7] * local_88[29]) == -0x13 && |
| 65 | + (((byte)(local_88[56] ^ local_88[29]) == 0x38 && |
| 66 | + ((char)(local_88[1] * local_88[37]) == 'd')))))))))) && |
| 67 | + (((byte)(local_88[56] ^ local_88[58]) == 0x46 && |
| 68 | + (((((((char)(local_88[2] * local_88[19]) == '&' && |
| 69 | + ((byte)(local_88[26] ^ local_88[22]) == 0x2b)) && |
| 70 | + ((char)(local_88[1] + local_88[7]) == -0x79)) && |
| 71 | + (((byte)(local_88[27] ^ local_88[0]) == 0x2a && |
| 72 | + ((char)(local_88[21] - local_88[1]) == '\v')))) && |
| 73 | + ((char)(local_88[27] + local_88[54]) == -0x32)) && |
| 74 | + (((byte)(local_88[17] ^ local_88[13]) == 0x3b && |
| 75 | + ((char)(local_88[19] - local_88[58]) == '\x12')))))))))) && |
| 76 | + ((((local_88[17] == local_88[10] && |
| 77 | + ((((char)(local_88[14] - local_88[58]) == 'M' && |
| 78 | + ((char)(local_88[42] * local_88[52]) == 'N')) && (local_88[50] == local_88[32])))) && |
| 79 | + (((byte)(local_88[47] ^ local_88[51]) == 0x38 && |
| 80 | + ((char)(local_88[38] + local_88[25]) == -0x6c)))) && |
| 81 | + ((char)(local_88[41] + local_88[52]) == -0x31)))))) && |
| 82 | + ((((local_88[44] == local_88[20] && ((char)(local_88[12] + local_88[25]) == 'f')) && |
| 83 | + (((char)(local_88[60] + local_88[36]) == -0xf && |
| 84 | + ((((char)(local_88[41] - local_88[21]) == '\x11' && |
| 85 | + ((char)(local_88[36] - local_88[49]) == 'D')) && |
| 86 | + ((char)(local_88[9] - local_88[35]) == 'D')))))) && |
| 87 | + ((((byte)(local_88[53] ^ local_88[51]) == 1 && ((byte)(local_88[34] ^ local_88[57]) == 0xd)) |
| 88 | + && ((((char)(local_88[11] - local_88[28]) == -0x15 && |
| 89 | + (((((char)(local_88[23] + local_88[24]) == -0x67 && |
| 90 | + ((char)(local_88[24] + local_88[13]) == -0x6b)) && |
| 91 | + (((char)(local_88[12] - local_88[0]) == -0x17 && |
| 92 | + (((((char)(local_88[34] + local_88[31]) == '`' && |
| 93 | + ((char)(local_88[5] + local_88[53]) == -0x6a)) && |
| 94 | + ((char)(local_88[49] * local_88[42]) == '`')) && |
| 95 | + (((char)(local_88[48] * local_88[21]) == '\x14' && |
| 96 | + ((char)(local_88[27] - local_88[52]) == '\x03')))))))) && |
| 97 | + ((char)(local_88[57] + local_88[20]) == -0x6b)))) && |
| 98 | + ((((char)(local_88[10] * local_88[53]) == -0x26 && |
| 99 | + ((char)(local_88[1] + local_88[41]) == -0x3c)) && |
| 100 | + (((char)(local_88[47] - local_88[1]) == '\v' && |
| 101 | + (((local_88[43] == local_88[19] && ((char)(local_88[39] + local_88[47]) == -0x6d)) && |
| 102 | + ((char)(local_88[12] * local_88[58]) == 'Q')))))))))))))) && |
| 103 | + (((((char)(local_88[8] * local_88[26]) == 'A' && ((char)(local_88[46] - local_88[31]) == 'E')) |
| 104 | + && ((char)(local_88[7] + local_88[37]) == 'h')) && |
| 105 | + (((((char)(local_88[36] + local_88[4]) == -0x44 && |
| 106 | + ((char)(local_88[31] + local_88[32]) == -0x5e)) && |
| 107 | + (((char)(local_88[25] + local_88[5]) == 'e' && |
| 108 | + ((((char)(local_88[43] * local_88[29]) == -0x13 && |
| 109 | + ((byte)(local_88[13] ^ local_88[45]) == 0x10)) && |
| 110 | + ((char)(local_88[48] - local_88[12]) == ';')))))) && |
| 111 | + (((((char)(local_88[23] - local_88[8]) == '\t' && |
| 112 | + ((byte)(local_88[7] ^ local_88[42]) == 0x41)) && |
| 113 | + ((char)(local_88[5] - local_88[43]) == -3)) && |
| 114 | + (((((byte)(local_88[60] ^ local_88[18]) == 0x1a && |
| 115 | + ((byte)(local_88[1] ^ local_88[3]) == 0x2f)) && |
| 116 | + (((char)(local_88[17] - local_88[39]) == '+' && |
| 117 | + (((((char)(local_88[8] + local_88[20]) == -0x2d && |
| 118 | + ((char)(local_88[11] * local_88[53]) == -0x28)) && |
| 119 | + ((char)(local_88[27] + local_88[6]) == -0x2e)) && |
| 120 | + (((char)(local_88[5] + local_88[3]) == -0x55 && |
| 121 | + ((char)(local_88[35] - local_88[47]) == -0x2e)))))))) && |
| 122 | + ((byte)(local_88[16] ^ local_88[33]) == 0x10)))))))))) { |
| 123 | + puts("Freedom at last!"); |
| 124 | + } |
| 125 | +``` |
| 126 | +
|
| 127 | +Now I promised myself to get more familiar with `angr` and tools as such before the contest, however I didn't have time. Reversing challenges that are solved with symbolic exeuction/SAT solving are somewhat popular I would say, still I had the pleasure of solving this by hand. |
| 128 | +
|
| 129 | +Because this is a flag, we know that the first four characters are `HTB{`. |
| 130 | +Then we can look for conditions where we know on side of the check, and try to see if there's a singular solution to the condition e.g `<known value> <some opeartion> <unknown value> == <constant>`. |
| 131 | +
|
| 132 | +Turns out there are quite some characters for which this is the case. As we start resolving more and more symbols this becomes easier. And finally get the flag. |
| 133 | +
|
| 134 | +HTB{H0p3_u_d1dn't_g3t_th15_by_h4nd,1t5_4_pr3tty_l0ng_fl4g!!!} |
| 135 | +
|
| 136 | +And the flag even jokes about my solution to the problem. For my next CTF I'll definitely read up on and practice with the intended method. |
0 commit comments