Description
Jessie recently acquired new computers and set them up with Debian, ensuring to incorporate the most current security enhancements. Nevertheless, two weeks following this setup, she discovers that her secrets file has been encrypted.
Find the content of the secrets file!
Decompiled-src
start
void __noreturn start() { _BYTE *v0; // esi int v1; // ecx __asm { int 80h; LINUX - sys_open } secret_fd = 5; __asm { int 80h; LINUX - sys_read int 80h; LINUX - sys_close } v0 = &secret_content; __asm { int 80h; LINUX - sys_newuname } v1 = 0; while ( *v0 ) { *v0 = (edata.nodename[v1] ^ *v0) + 1; ++v0; if ( ++v1 >= 6 ) v1 = 0; } __asm { int 80h; LINUX - sys_creat } enc_fd = 8; __asm { int 80h; LINUX - sys_write int 80h; LINUX - sys_close int 80h; LINUX - sys_exit } }
sys_newuname 시스템 콜을 이용하여 사용자명을 가져온다.
6바이트씩 반복해서 18바이트의 _edata에 저장된다.
문제 설명을 보면 사용자명이 “debian”이기 때문에 _edata는 아래와 같다.
xor_box = \ [0x64, 0x65, 0x62, 0x69, 0x61, 0x6e] * 3
0x64 = d,
0x65 = e,
0x62 = b,
0x69 = i,
0x61 = a,
0x6e = n
18바이트의 원문인 secrets.txt.를 xor_box의 1바이트씩 순회화면서 XOR 연산하고 1을 더해서
write 시스템 콜을 이용해서 secrets.txt.enc 암호화 파일을 저장한다.
solve.py
with open("secrets.txt.enc", 'rb') as f: enc = f.read() xor_box = \ [0x64, 0x65, 0x62, 0x69, 0x61, 0x6e] * 3 for i in range(18): print(chr((enc[i] - 1) ^ xor_box[i]), end='')
암호화된 secrest.txt.enc 파일 내용으로부터 1바이트씩 1을 빼고 XOR 연산을 하면 원문 데이터를 구할 수 있다.
Result
seo@seo:~/Documents/gcc_ctf_2024/ransom$ python3 solve.py GCC{S1MPL3_0BFU!!}