rev-basic-7 문제도 마찬가지로 문자열을 역참조해서
문자열을 암호화시키는 함수를 찾을 수 있다. 위 게시물 참조하기 바람.
암호화시키는 함수만 들여다보면 아래와 같다.
sub_140001000 ... movsxd rax, [rsp+18h+var_18] mov rcx, [rsp+18h+arg_0] movzx eax, byte ptr [rcx+rax] imul eax, 0FBh and eax, 0FFh movsxd rcx, [rsp+18h+var_18] lea rdx, byte_140003000 movzx ecx, byte ptr [rdx+rcx] cmp eax, ecx ...
movsxd rax, [rsp+18h+var_18] mov rcx, [rsp+18h+arg_0] movzx eax, byte ptr [rcx+rax]
초기로 가정했을때 반복문에서의 카운트 변수값인 0을 인덱스로 지정하여
EAX에는 입력받은 0번째 문자값이 들어간다.
imul eax, 0FBh and eax, 0FFh
eax 값을 0xFB와 곱하고, 곱한 값을 0xFF와 and 연산한 값을 eax에 다시 저장한다.
eax = (eax * 0xFB) & 0xFF
movsxd rcx, [rsp+18h+var_18] lea rdx, byte_140003000 movzx ecx, byte ptr [rdx+rcx] cmp eax, ecx
그리고 EAX 값과 ECX값인 ‘암호화된 문자열[0]’과 서로 비교한다.
암호화된 문자열은(byte_140003000)은 아래와 같았다.
\xAC\xF3\x0C\x25\xA3\x10\xB7\x25\x16\xC6\xB7\xBC\x07\x25\x02\xD5\xC6\x11\x07\xC5\x00
아래와 같이 한문자씩 계속 비교한다고 볼 수 있다.
암호화된 문자열[n] != (입력받은 문자열[n] * 0xFB) & 0xFF 0xAC != (입력받은 0번째 문자값 * 0xFB) & 0xFF 0xF3 != (입력받은 1번째 문자값 * 0xFB) & 0xFF 0x0C != (입력받은 2번째 문자값 * 0xFB) & 0xFF ...
결론적으로 reb-basic-4 풀이와 비슷하게 계속 대입하는 방식으로 비슷하게 풀 수 있었다.
0~127 아스키 숫자 범위 안으로 무작위 대입해서 값을 구하였다.
enc_str = b'\xAC\xF3\x0C\x25\xA3\x10\xB7\x25\x16\xC6\xB7\xBC\x07\x25\x02\xD5\xC6\x11\x07\xC5\x00' dec_str = "" for i in range(len(enc_str)): for j in range(127): if enc_str[i] == (j * 0xfb) & 0xff: dec_str = dec_str + chr(j) print(dec_str)
ubuntu@WSL:~/CTF/dreamhack.io/chall8$ python3 chall8.py Did_y0u_brute_force?