리버싱 문제
코드 분석
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) & 0x7F;
result[0] = byte_40DF;
for ( j = 1; j <= 62; ++j )
result[j] = rot[63 - j];
byte_413F = 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;
}
- input 64자
- rot[i] 값은 input에 13 씩 더해주면 (시저 암호화) 127을 넘을 수 없다.
- rot[i] 를 뒤집어 result[i]를 만들고
- result[i] 를 ^ 3 하여, result2[i] 를 만든다
Solver
#!/usr/bin/env python3
# solv.py
cmp_str = 'C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q'
# xor 3
list = list()
for char in cmp_str:
char = ord(char) ^ 3
list.append(chr(char))
# xor 두번 해주어, result[i]로 만든다.
xor = ''.join(str(s) for s in list)
print(xor)
print('\n')
# 문자열 역순으로 나열
result = xor[::-1]
# 역순으로 나열하여, rot[i]를 만든다.
print(result)
print('\n')
# rot 역연산
list.clear()
for ch in result:
ch = ((ord(ch) - 13) % 127)
list.append(chr(ch))
# 13 마이너스 해주고 %127로 &127을 보정해준다.
input_val = ''.join(str(s) for s in list)
print('Correct input value is: ', input_val)
Solver는 해답으로 이해했지만,
사실 이해 안되는 것은
result[0] 과 rot[0]의 존재
대강 해당 값들이 result[0], result[63]의 고정 값이고,
고정 값은 xor과 역연산에 영향을 받지 않는다는 것을 알아라~! 인것으로 보인다.
'Hacking > DreamHack' 카테고리의 다른 글
Period (pwnable) (0) | 2025.04.02 |
---|---|
Movie time table (WEB) (0) | 2025.04.01 |
[CodeEngn] Malware L08 (1) | 2024.09.04 |
Dream Gallery (0) | 2024.09.04 |
Additional calculator (0) | 2024.09.04 |