Wargame
Greatest Common Divisor
1. intro 2. code 및 분석 2.1. code N/A 2.2. 분석 최대공약수 즉 GCD를 구하는 문제이다. 이는 유클리드 호제법을 통해 쉽게 구할 수 있으며, 아래 링크와 같이 직접 만들어보았다. 2023.02.01 - [Tips & theory] - Euclidean algorithm - 유클리드 호제법 Euclidean algorithm - 유클리드 호제법 서론 크.... 내가 유클리드 호제법에 대해서 포스팅하는 날이 올줄이야... 상상도 못했다 ㅋㅋㅋ 이론 임의의 두 정수가 있을 때 두 정수의 최대공약수를 구하는 방법 중 하나가 유클리드 호제법 wyv3rn.tistory.com 3. exploit a = int(input()) b = int(input()) while 1: if a < ..
You either know, XOR you don't
1. intro 2. code 및 분석 2.1. code N/A 2.2. 분석 이제부터 시작인가보다. 힌트로는 역시 flag 형식을 생각해보라고 한다. 우선 해당 문자열을 byte 값으로 바꾸고, xor로 0부터 0xff까지 연산하면서 첫 문자가 c 일 때를 출력해보았다. e = bytes.fromhex('0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104') d = '' for i in range(0xff): for j in range(len(e)): d += chr(e[j] ^ i) if d[0] == 'c': print(hex(i), d) d = '' ┌──(kali㉿kali)-[~/Downloads..
Favourite byte
1. intro 2. code 및 분석 2.1. code N/A 2.2. 분석 문제 설명을 보면 싱글 바이트와 xor 했다고 되어있다. 그러므로 0x1부터 0xff까지 쭉 뽑아보면 답이 나올 것이다. 조금 더 빠르게 하려면 아무래도 flag 형식이 crypto 이기에 첫 문자가 c인 경우만 추려내도 좋을 것이다. 3. exploit e = bytes.fromhex('73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d') d = '' for i in range(0xff): for j in range(len(e)): d += chr(e[j] ^ i) if d[0] == 'c': print(d) d = '' ┌──(kali㉿kali)-[~/D..
XOR properties
1. intro 2. code 및 분석 2.1. code N/A 2.2. 분석 이번에는 xor의 성질을 알려준다. 문제에서 알려주듯, xor은 뭐랄까... 다항식에서의 양 변의 이동 같은? 그런 아이이다. 성질 자체가 같은 경우에는 0, 다른 경우에만 1을 나타내기 때문에 이를 항상 유념해야한다. 문제에서는 KEY1 KEY2 ^ KEY1 KEY2 ^ KEY3 FLAG ^ KEY1 ^ KEY3 ^ KEY2 의 값을 주며, 이를 적절히 연산해서 flag 값을 구하면 된다. 조금 더 상세히 표현하자면 KEY1 = a KEY2 ^ KEY1 = b KEY2 ^ KEY3 = c FLAG ^ KEY1 ^ KEY3 ^ KEY2 = d 로 가정하면 FLAG ^ a ^ KEY3 ^ KEY2 = d FLAG ^ a ^ KE..
XOR Starter
1. intro 2. code 및 분석 2.1. code N/A 2.2. 분석 기본적인 xor 사용법에 대한 문제이다. 한자 한자 불러와서 그냥 xor 하면 되겠다. 3. exploit 아직까진 익숙하지 않아 chr인지, byte인지 hex인지 명시해주는게 영 어색하다. from Crypto.Util.number import * e = 'label' d ='' for i in range(len(e)): d += chr(ord(e[i]) ^ 13) print(d) ┌──(kali㉿kali)-[~/Downloads] └─$ python solve.py aloha
Bytes and Big Integers
1. intro 2. code 및 분석 2.1. code N/A 2.2. 분석 마찬가지로 해석해보면, RSA와 같은 cryptosystem은 숫자로 작동한다. 하지만 메시지는 문자로 이루어져있다. 수학적 연산이 적용될 수 있도록 어떻게 우리의 메시지를 숫자로 변경해야할까. 가장 일반적인 방법은, 메시지를 hex로 바꾸고, 합치고, 10진수로 변환하는 것이다. 이는 16진수 또는 10진수로 표현할 수 있다. 이 문제는 pycryptodome의 사용법에 대한 팁을 주는 정도인 것 같다. 3. exploit 하지만 나는 그렇게 풀지 않긔. 직접 풀어보고 함수 써볼거임 ㅋㅋㅋ e = 115151950638623188999316854888137473957755162872896826364999652827146372..
Base64
1. intro 2. code 및 분석 2.1. code N/A 2.2. 분석 마찬가지로 문제의 설명을 간단히 해석해보면 다른 일반적인 인코딩 스킴으로 base 64가 있다. 이것은 바이너리 데이터를 64자리의 알파벳으로 구성된 ascii string으로 대체하는 방식이다. base 64로 인코딩된 하나의 문자는 6비트이며, 4개의 문자가 3개의 8비트 바이트로 구성된다. 이게 뭥말인가? 하면 아래 테이블 하나면 해결된다. Text content M a n ASCII 77 97 110 Bit pattern 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0 Index 19 22 5 46 Base64-Encoded T W F u 그리고 값에 따라 대응하는 base 64 e..
Hex
1. intro 2. code 및 분석 2.1. code N/A 2.2. 분석 문제의 설명을 간단히 해석해보면 일반적으로 encrypt된 결과는 ASCII character가 아닌 bytes로 표현된다. hex 값은 ascii strings로 대체하여 사용될 수 있다. 각각의 문자를 10진수로 표현하고, 이를 16진수 즉 hexadecimal로 변환한다. 그리고 그 값을 합치면 긴 hex string이 된다. 3. exploit 함수를 몰라도 이렇게 풀 수 있다. e = '63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d' d = '' for i in range(0,len(e..
ASCII
1. intro 2. code 및 분석 2.1. code N/A 2.2. 분석 앞의 문제를 풀었다면 자동으로 따라오는 문제이지 않나 생각한다. 3. exploit e = [99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, 51, 125] d = '' for i in range(len(e)): d += chr(e[i]) print(d) ┌──(kali㉿kali)-[~/Downloads] └─$ python solve.py crypto{ASCII_pr1nt4bl3}
Great Snakes
1. intro 2. code 및 분석 2.1. code #!/usr/bin/env python3 import sys # import this if sys.version_info.major == 2: print("You are running Python 2, which is no longer supported. Please update to Python 3.") ords = [81, 64, 75, 66, 70, 93, 73, 72, 1, 92, 109, 2, 84, 109, 66, 75, 70, 90, 2, 92, 79] print("Here is your flag:") print("".join(chr(o ^ 0x32) for o in ords)) 2.2. 분석 대놓고 있는 플래그 #2 + python ..