Description
이 문제는 사용자에게 문자열 입력을 받아 입력값을 검증하고 플래그를 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 플래그를 찾으세요!
플래그 형식은 DH{…} 입니다.
Files
ubuntu@WSL2:~/CTF/dreamhack.io$ tree r-xor-t r-xor-t └── chall 0 directories, 1 files ubuntu@WSL2:~/CTF/dreamhack.io$ file r-xor-t/chall r-xor-t/chall: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=33a237858013fb8a830e1f65ea327ab9c78dba62, for GNU/Linux 3.2.0, not stripped
64비트 리눅스용 실행 파일 하나.
분석
main
int __cdecl main(int argc, const char **argv, const char **envp) { int k; // [rsp+4h] [rbp-Ch] int j; // [rsp+8h] [rbp-8h] int i; // [rsp+Ch] [rbp-4h] puts("Input: "); __isoc99_scanf("%s", input); if ( strlen(input) == 64 ) { for ( i = 0; i <= 63; ++i ) rot[i] = (input[i] + 13) & 127; result[0] = rot[63]; for ( j = 1; j <= 62; ++j ) result[j] = rot[63 - j]; result[63] = rot[0]; for ( k = 0; k <= 64; ++k ) result2[k] = result[k] ^ 3; } if ( !strncmp(result2, "C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q", 0x40uLL) ) { puts("\nNice!"); printf("Flag is DH{%s}\n", input); } return 0; }
- 사용자로부터 64바이트의 input 값을 입력받는다.
- 각각 하나의 문자를 아스키 코드 값으로 생각해서 13을 더하고 127을 AND 연산한다.
연산한 값들은 rot 변수에 저장된다.
char형식으로 나타나야 하기 때문에 127을 AND 연산하는 듯 하다. - 각각 하나의 문자를 역순으로 result에 저장시킨다.
- result에 저장된 각각 하나의 문자를 3과 XOR시켜서 result2에 저장한다.
풀이
역순으로 계산하면 답이 나온다.
- “C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q” 64바이트 문자열을 3과 XOR시킨다.
- XOR시킨 문자열에 있는 각각 하나의 문자를 역순으로 문자열을 다시 저장시킨다.
- 역순으로 저장한 문자열에 있는 각각 하나의 문자의 아스키코드값에서 13을 빼서 문자열을 다시 저장시킨다.
Solution
result2 = "C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q" result = "" rot = "" input = "" for i in range(len(result2)): result = result + chr(ord(result2[i]) ^ 3) for i in range(len(result)): rot = rot + chr(ord(result[len(result) - i - 1])) for i in range(len(rot)): input = input + chr(ord(rot[i]) - 13) print(input)
PS Microsoft.PowerShell.Core\FileSystem::\\wsl.localhost\Ubuntu\home\ubuntu\CTF\dreamhack.io\r-xor-t> python3 solve.py e615b75a4d563ac971466e05641d7aed556b62fcb460b6027f126bff411bfe63
FLAG
DH{e615b75a4d563ac971466e05641d7aed556b62fcb460b6027f126bff411bfe63}