사실 이런 경우 방법은 여러 가지이고 사람마다 다른 방법이 있겠습니다만,
저는 상수를 보았습니다. (왜 상수를 보았냐면, 눈에 띄었기 때문이죠.)
0xd76aa478; 0xe8c7b756; 0x242070db;
K [0 .. 3] : = {0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee}
K [4 .. 7] : = {0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501}
K [8..11] : = {0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be}
K [12..15] : = {0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821}
K [16..19] : = {0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa}
K [20..23] : = {0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8}
K [24..27] : = {0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed}
K [28..31] : = {0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a}
K [32..35] : = {0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c}
K [36..39] : = {0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70}
K [40..43] : = {0x289b7ec6, 0xea127fa, 0xd4ef3085, 0x04881d05}
K [44..47] : = {0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665}
K [48..51] : = {0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039}
K [52..55] : = {0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1}
K [56..59] : = {0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1}
K [60..63] : = {0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391}
사실 이 정도까지만 보여주어도 눈치 빠르신 분들은 벌써 감이 올 것이라 생각합니다. 아래 함수에서 하나씩 더해주는 부분이 있는데, 이 부분은 확실히 md5 해시 알고리즘이기 때문이죠. 그림에서 Mi 는 입력 메시지의 i번째 32bit 블록을 의미하고, Ki는 4294967296 * abs(sin(i)) 의 정수부분입니다. (i는 라디안, 0<= i <= 63) (abs는 절대값) K값은 미리 계산이 가능하기 때문에 메모리가 여유 있으면 속도를 위해서 미리 계산한 값을 사용하기도 합니다.
간단히 분석해보면 위의 내용은 md5가 있을 때 그걸 소화시키는 용도로 사용하는 필수 bytes들입니다. 그걸 연산에 사용하는 것으로 보아 자연스럽게 이 함수의 내용이 md5의 인코딩 내용이라고 추측할 수 있습니다.
uVar4 = param_1[1];
uVar3 = param_1[2];
uVar1 = *param_1 + (uVar4 & uVar3 | ~uVar4 & param_1[3]) + *param_2 + 0xd76aa478;
uVar1 = (uVar1 * 0x80 | uVar1 >> 0x19) + uVar4;
uVar2 = param_1[3] + (uVar1 & uVar4 | ~uVar1 & uVar3) + param_2[1] + 0xe8c7b756;
uVar2 = (uVar2 * 0x1000 | uVar2 >> 0x14) + uVar1;
uVar3 = uVar3 + (uVar2 & uVar1 | ~uVar2 & uVar4) + param_2[2] + 0x242070db;
uVar3 = (uVar3 >> 0xf | uVar3 * 0x20000) + uVar2;
uVar4 = uVar4 + (uVar3 & uVar2 | ~uVar3 & uVar1) + param_2[3] + 0xc1bdceee;
uVar4 = (uVar4 >> 10 | uVar4 * 0x400000) + uVar3;
uVar1 = uVar1 + (uVar4 & uVar3 | ~uVar4 & uVar2) + param_2[4] + 0xf57c0faf;
uVar1 = (uVar1 * 0x80 | uVar1 >> 0x19) + uVar4;
uVar2 = uVar2 + (uVar1 & uVar4 | ~uVar1 & uVar3) + param_2[5] + 0x4787c62a;
uVar2 = (uVar2 * 0x1000 | uVar2 >> 0x14) + uVar1;
uVar3 = uVar3 + (uVar2 & uVar1 | ~uVar2 & uVar4) + param_2[6] + 0xa8304613;
uVar3 = (uVar3 >> 0xf | uVar3 * 0x20000) + uVar2;
uVar4 = uVar4 + (uVar3 & uVar2 | ~uVar3 & uVar1) + param_2[7] + 0xfd469501;
uVar4 = (uVar4 >> 10 | uVar4 * 0x400000) + uVar3;
uVar1 = uVar1 + (uVar4 & uVar3 | ~uVar4 & uVar2) + param_2[8] + 0x698098d8;
uVar1 = (uVar1 * 0x80 | uVar1 >> 0x19) + uVar4;
uVar2 = uVar2 + (uVar1 & uVar4 | ~uVar1 & uVar3) + param_2[9] + 0x8b44f7af;
uVar2 = (uVar2 * 0x1000 | uVar2 >> 0x14) + uVar1;
uVar3 = (uVar3 + (uVar2 & uVar1 | ~uVar2 & uVar4) + param_2[10]) - 0xa44f;
uVar3 = (uVar3 >> 0xf | uVar3 * 0x20000) + uVar2;
uVar4 = uVar4 + (uVar3 & uVar2 | ~uVar3 & uVar1) + param_2[0xb] + 0x895cd7be;
uVar4 = (uVar4 >> 10 | uVar4 * 0x400000) + uVar3;
uVar1 = uVar1 + (uVar4 & uVar3 | ~uVar4 & uVar2) + param_2[0xc] + 0x6b901122;
uVar1 = (uVar1 * 0x80 | uVar1 >> 0x19) + uVar4;
uVar2 = uVar2 + (uVar1 & uVar4 | ~uVar1 & uVar3) + param_2[0xd] + 0xfd987193;
uVar2 = (uVar2 * 0x1000 | uVar2 >> 0x14) + uVar1;
uVar3 = uVar3 + (uVar2 & uVar1 | ~uVar2 & uVar4) + param_2[0xe] + 0xa679438e;
uVar3 = (uVar3 >> 0xf | uVar3 * 0x20000) + uVar2;
uVar4 = uVar4 + (uVar3 & uVar2 | ~uVar3 & uVar1) + param_2[0xf] + 0x49b40821;
uVar4 = (uVar4 >> 10 | uVar4 * 0x400000) + uVar3;
uVar1 = uVar1 + (uVar4 & uVar2 | ~uVar2 & uVar3) + param_2[1] + 0xf61e2562;
uVar1 = (uVar1 * 0x20 | uVar1 >> 0x1b) + uVar4;
uVar2 = uVar2 + (uVar1 & uVar3 | ~uVar3 & uVar4) + param_2[6] + 0xc040b340;
uVar2 = (uVar2 * 0x200 | uVar2 >> 0x17) + uVar1;
uVar3 = uVar3 + (uVar2 & uVar4 | ~uVar4 & uVar1) + param_2[0xb] + 0x265e5a51;
uVar3 = (uVar3 * 0x4000 | uVar3 >> 0x12) + uVar2;
uVar4 = uVar4 + (uVar3 & uVar1 | ~uVar1 & uVar2) + *param_2 + 0xe9b6c7aa;
uVar4 = (uVar4 >> 0xc | uVar4 * 0x100000) + uVar3;
uVar1 = uVar1 + (uVar4 & uVar2 | ~uVar2 & uVar3) + param_2[5] + 0xd62f105d;
uVar1 = (uVar1 * 0x20 | uVar1 >> 0x1b) + uVar4;
uVar2 = uVar2 + (uVar1 & uVar3 | ~uVar3 & uVar4) + param_2[10] + 0x2441453;
uVar2 = (uVar2 * 0x200 | uVar2 >> 0x17) + uVar1;
uVar3 = uVar3 + (uVar2 & uVar4 | ~uVar4 & uVar1) + param_2[0xf] + 0xd8a1e681;
uVar3 = (uVar3 * 0x4000 | uVar3 >> 0x12) + uVar2;
uVar4 = uVar4 + (uVar3 & uVar1 | ~uVar1 & uVar2) + param_2[4] + 0xe7d3fbc8;
uVar4 = (uVar4 >> 0xc | uVar4 * 0x100000) + uVar3;
uVar1 = uVar1 + (uVar4 & uVar2 | ~uVar2 & uVar3) + param_2[9] + 0x21e1cde6;
uVar1 = (uVar1 * 0x20 | uVar1 >> 0x1b) + uVar4;
uVar2 = uVar2 + (uVar1 & uVar3 | ~uVar3 & uVar4) + param_2[0xe] + 0xc33707d6;
uVar2 = (uVar2 * 0x200 | uVar2 >> 0x17) + uVar1;
uVar3 = uVar3 + (uVar2 & uVar4 | ~uVar4 & uVar1) + param_2[3] + 0xf4d50d87;
uVar3 = (uVar3 * 0x4000 | uVar3 >> 0x12) + uVar2;
uVar4 = uVar4 + (uVar3 & uVar1 | ~uVar1 & uVar2) + param_2[8] + 0x455a14ed;
uVar4 = (uVar4 >> 0xc | uVar4 * 0x100000) + uVar3;
uVar1 = uVar1 + (uVar4 & uVar2 | ~uVar2 & uVar3) + param_2[0xd] + 0xa9e3e905;
uVar1 = (uVar1 * 0x20 | uVar1 >> 0x1b) + uVar4;
uVar2 = uVar2 + (uVar1 & uVar3 | ~uVar3 & uVar4) + param_2[2] + 0xfcefa3f8;
uVar2 = (uVar2 * 0x200 | uVar2 >> 0x17) + uVar1;
uVar3 = uVar3 + (uVar2 & uVar4 | ~uVar4 & uVar1) + param_2[7] + 0x676f02d9;
uVar3 = (uVar3 * 0x4000 | uVar3 >> 0x12) + uVar2;
uVar4 = uVar4 + (uVar3 & uVar1 | ~uVar1 & uVar2) + param_2[0xc] + 0x8d2a4c8a;
uVar4 = (uVar4 >> 0xc | uVar4 * 0x100000) + uVar3;
uVar1 = (uVar1 + (uVar4 ^ uVar3 ^ uVar2) + param_2[5]) - 0x5c6be;
uVar1 = (uVar1 * 0x10 | uVar1 >> 0x1c) + uVar4;
uVar2 = uVar2 + (uVar1 ^ uVar4 ^ uVar3) + param_2[8] + 0x8771f681;
uVar2 = (uVar2 * 0x800 | uVar2 >> 0x15) + uVar1;
uVar3 = uVar3 + (uVar2 ^ uVar1 ^ uVar4) + param_2[0xb] + 0x6d9d6122;
uVar3 = (uVar3 * 0x10000 | uVar3 >> 0x10) + uVar2;
uVar4 = uVar4 + (uVar3 ^ uVar2 ^ uVar1) + param_2[0xe] + 0xfde5380c;
uVar4 = (uVar4 >> 9 | uVar4 * 0x800000) + uVar3;
uVar1 = uVar1 + (uVar4 ^ uVar3 ^ uVar2) + param_2[1] + 0xa4beea44;
uVar1 = (uVar1 * 0x10 | uVar1 >> 0x1c) + uVar4;
uVar2 = uVar2 + (uVar1 ^ uVar4 ^ uVar3) + param_2[4] + 0x4bdecfa9;
uVar2 = (uVar2 * 0x800 | uVar2 >> 0x15) + uVar1;
uVar3 = uVar3 + (uVar2 ^ uVar1 ^ uVar4) + param_2[7] + 0xf6bb4b60;
uVar3 = (uVar3 * 0x10000 | uVar3 >> 0x10) + uVar2;
uVar4 = uVar4 + (uVar3 ^ uVar2 ^ uVar1) + param_2[10] + 0xbebfbc70;
uVar4 = (uVar4 >> 9 | uVar4 * 0x800000) + uVar3;
uVar1 = uVar1 + (uVar4 ^ uVar3 ^ uVar2) + param_2[0xd] + 0x289b7ec6;
uVar1 = (uVar1 * 0x10 | uVar1 >> 0x1c) + uVar4;
uVar2 = uVar2 + (uVar1 ^ uVar4 ^ uVar3) + *param_2 + 0xeaa127fa;
uVar2 = (uVar2 * 0x800 | uVar2 >> 0x15) + uVar1;
uVar3 = uVar3 + (uVar2 ^ uVar1 ^ uVar4) + param_2[3] + 0xd4ef3085;
uVar3 = (uVar3 * 0x10000 | uVar3 >> 0x10) + uVar2;
uVar4 = uVar4 + (uVar3 ^ uVar2 ^ uVar1) + param_2[6] + 0x4881d05;
uVar4 = (uVar4 >> 9 | uVar4 * 0x800000) + uVar3;
uVar1 = uVar1 + (uVar4 ^ uVar3 ^ uVar2) + param_2[9] + 0xd9d4d039;
uVar1 = (uVar1 * 0x10 | uVar1 >> 0x1c) + uVar4;
uVar2 = uVar2 + (uVar1 ^ uVar4 ^ uVar3) + param_2[0xc] + 0xe6db99e5;
uVar2 = (uVar2 * 0x800 | uVar2 >> 0x15) + uVar1;
uVar3 = uVar3 + (uVar2 ^ uVar1 ^ uVar4) + param_2[0xf] + 0x1fa27cf8;
uVar3 = (uVar3 * 0x10000 | uVar3 >> 0x10) + uVar2;
uVar4 = uVar4 + (uVar3 ^ uVar2 ^ uVar1) + param_2[2] + 0xc4ac5665;
uVar4 = (uVar4 >> 9 | uVar4 * 0x800000) + uVar3;
uVar1 = uVar1 + ((~uVar2 | uVar4) ^ uVar3) + *param_2 + 0xf4292244;
uVar1 = (uVar1 * 0x40 | uVar1 >> 0x1a) + uVar4;
uVar2 = uVar2 + ((~uVar3 | uVar1) ^ uVar4) + param_2[7] + 0x432aff97;
uVar2 = (uVar2 * 0x400 | uVar2 >> 0x16) + uVar1;
uVar3 = uVar3 + ((~uVar4 | uVar2) ^ uVar1) + param_2[0xe] + 0xab9423a7;
uVar3 = (uVar3 * 0x8000 | uVar3 >> 0x11) + uVar2;
uVar4 = uVar4 + ((~uVar1 | uVar3) ^ uVar2) + param_2[5] + 0xfc93a039;
uVar4 = (uVar4 >> 0xb | uVar4 * 0x200000) + uVar3;
uVar1 = uVar1 + ((~uVar2 | uVar4) ^ uVar3) + param_2[0xc] + 0x655b59c3;
uVar1 = (uVar1 * 0x40 | uVar1 >> 0x1a) + uVar4;
uVar2 = uVar2 + ((~uVar3 | uVar1) ^ uVar4) + param_2[3] + 0x8f0ccc92;
uVar2 = (uVar2 * 0x400 | uVar2 >> 0x16) + uVar1;
uVar3 = (uVar3 + ((~uVar4 | uVar2) ^ uVar1) + param_2[10]) - 0x100b83;
uVar3 = (uVar3 * 0x8000 | uVar3 >> 0x11) + uVar2;
uVar4 = uVar4 + ((~uVar1 | uVar3) ^ uVar2) + param_2[1] + 0x85845dd1;
uVar4 = (uVar4 >> 0xb | uVar4 * 0x200000) + uVar3;
uVar1 = uVar1 + ((~uVar2 | uVar4) ^ uVar3) + param_2[8] + 0x6fa87e4f;
uVar1 = (uVar1 * 0x40 | uVar1 >> 0x1a) + uVar4;
uVar2 = uVar2 + ((~uVar3 | uVar1) ^ uVar4) + param_2[0xf] + 0xfe2ce6e0;
uVar2 = (uVar2 * 0x400 | uVar2 >> 0x16) + uVar1;
uVar3 = uVar3 + ((~uVar4 | uVar2) ^ uVar1) + param_2[6] + 0xa3014314;
uVar3 = (uVar3 * 0x8000 | uVar3 >> 0x11) + uVar2;
uVar4 = uVar4 + ((~uVar1 | uVar3) ^ uVar2) + param_2[0xd] + 0x4e0811a1;
uVar4 = (uVar4 >> 0xb | uVar4 * 0x200000) + uVar3;
uVar1 = uVar1 + ((~uVar2 | uVar4) ^ uVar3) + param_2[4] + 0xf7537e82;
uVar1 = (uVar1 * 0x40 | uVar1 >> 0x1a) + uVar4;
uVar2 = uVar2 + ((~uVar3 | uVar1) ^ uVar4) + param_2[0xb] + 0xbd3af235;
uVar2 = (uVar2 * 0x400 | uVar2 >> 0x16) + uVar1;
uVar3 = uVar3 + ((~uVar4 | uVar2) ^ uVar1) + param_2[2] + 0x2ad7d2bb;
uVar3 = (uVar3 * 0x8000 | uVar3 >> 0x11) + uVar2;
uVar4 = uVar4 + ((~uVar1 | uVar3) ^ uVar2) + param_2[9] + 0xeb86d391;
친절하게 md5로 인코딩하는 라운드 계산까지 나와있군요.
해시 알고리즘이 무엇인지 정확히 추출했습니다.
이렇게 무엇으로 인코딩하는지 파악한 경우 어떤 메시지인지 역으로 추적하는 방법은 크게 두 가지가 있습니다. 하나는 crackstation을 이용해서 끄집어내는 것이고 다른 하나는 전체 경우의 수를 따져 브루트포싱을 하는 것입니다.
쉽죠?
'호그와트' 카테고리의 다른 글
드림핵 secret message 목을 딸 때가 왔다 (0) | 2022.05.31 |
---|---|
beauty 후후훗 (0) | 2022.05.30 |
드림핵 dreamhack fly to the moon (0) | 2022.05.12 |
dreamhack dom xss (3) | 2022.05.12 |
드림핵 xss filtering bypass advanced (0) | 2022.05.12 |