|  | 
|  | 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