There are 72 functions, and we don't need to do the inverse operation. The first part of the flag is always 'flag{' and we only need to know the first 8 bytes to get the rest very quickly
2. Savage
Fibonacci sequences can be optimized with DP
3. Crispy Chicken Attack (CCA)
This problem is solvable if we know r. Since we can't decrypt flag directly, we can decrypt flag by multiplying it by a random value a. Here, a must be 1 for a^e mod N, where a satisfies N + 1. Here, a must be equal to 1 when a^e mod N, and the a that satisfies this is N + 1. Let r be the result of Plaintext Encrypt (01) -> Decrypt. Divide the obtained flag by r to get the answer
4. loseLESS
A program that encrypts using the Huffman coding tree. Tight reversing process
5. Socks
It's a file that receives data over a socket and performs an action based on the field. Underneath, it runs a function called Service as a thread.
Service call do_auth() internally. In do_auth, we can insert Username, followed by the Flag, so if we fill the buffer so that there are no 0x00 bytes, we can get the Flag on the output.
However, when the auth_list_check function is called, the value of Flag is internally put into the Flag variable.
So, to match the conditions of the Auth_list_check, we can write the code below to match the fields and get the flag as intended.
6. LCG(Unsolved)
Most LCGs give you one of m, c, or a, but in this problem they were all 65565-bit primes. I solved most of the problem and tried to figure out how to solve it, but ultimately I could't find it.
KOREAN
1. Rockstar
72개의 함수가 있는데, 역연산을 할 필요가 없다. 플래그의 앞부분은 무조건 ‘flag{‘ 이고 우리는 앞부분 8바이트만 알면 나머지 부분을 아주 빠른 시간 내에 구할 수 있다~
2. Savage
피보나치 수열은 dp로 최적화할 수 있다
3. Crispy Chicken Attack (CCA)
r만 알면 풀리는 문제이다. flag를 직접적으로 복호화할 수 없는데, 우리는 flag에다 임의의 값 a를 곱하여 flag를 복호화할 수 있다. 여기서 a가 a^e mod N을 했을 때 1이여야 하는데, 이를 만족하는 a는 N + 1이다. r은 Plaintext Encrypt (01) -> Decrypt 하면 그게 r이다. 구한 플래그를 r로 나누면 답이다
4. loseLESS
허프만 코딩 트리를 사용해서 암호화하는 프로그램이다. 리버싱 과정이 빡셌음
5. Socks
대충 Socket으로 Data받아서 필드에 따른 동작을 하는 파일이다 밑에 보면 Service라는 함수를 쓰레드로 실행시키는데
Service는 내부적으로 Do_auth를 실행시킨다. do_auth에서는 Username을 받는데 Username 바로 뒤가 Flag이므로 0x00바이트가 없도록 버퍼를 꽉 채워주면 출력시 Flag를 얻을 수 있다.
그런데 auth_list_check함수가 호출되어야 내부적으로 Flag 변수안에 Flag값이 들어가게 된다.
그래서 Auth_list_check의 조건을 맞춰주기 위해 아래와 같이 코드를 짜면 필드를 맞춰주어서 의도한대로 플래그를 얻을 수 있다.
6. LCG (못 품)
대부분의 LCG는 m,c,a 중 하나는 알려주는데 이 문제의 경우에는 전부 65565비트짜리의 소수였다. 대부분의 문제를 풀고 어떻게 풀어야하나 고민했지만 결국 풀지는 못했다.