hiariz 님의 블로그
[2025 ACS] deep_dive 본문
문제 코드는 다음과 같습니다.
__int64 __fastcall main(int a1, char **a2, char **a3)
{
printf("Enter flag: ");
__isoc99_scanf("%s", &byte_6040);
if ( strlen(&byte_6040) == 69 )
return sub_126F((unsigned int)byte_6040);
puts("wrong");
return 1LL;
}
__int64 __fastcall sub_11C9(unsigned __int8 a1)
{
unsigned __int8 v2; // [rsp+0h] [rbp-4h]
v2 = ((int)(unsigned __int8)((a1 >> 4) | (16 * a1)) >> 2) & 0x33 | (4 * ((a1 >> 4) | (16 * a1))) & 0xCC;
return ((int)v2 >> 1) & 0x55 | (2 * v2) & 0xAAu;
}
__int64 __fastcall sub_1225(unsigned __int8 a1, int a2)
{
return ((int)a1 >> (a2 % 8)) | (a1 << (8 - a2 % 8));
}
__int64 __fastcall sub_126F(unsigned __int8 a1)
{
unsigned __int8 v1; // al
v1 = sub_11C9(a1);
if ( ((unsigned __int8)sub_1225(v1, 5LL) ^ 5) != byte_6086 )
{
puts("wrong");
exit(1);
}
return sub_12DB((unsigned int)byte_6041);
}
위의 문제는 간단한 난독화 문제로 2개의 난독 함수를 통해 입력 값을 암호화 시킵니다.
그리고 마지막 함수처럼 난독화된 값을 저장된 값과 비교하여 같으면 다음 스테이지로 이동하고 틀리면 wrong을 출력하고 프로그램을 종료시킵니다.
따라서 위의 로직을 그대로 가져와 비교하고자 하는 값을 다시 넣어 입력해야하는 값을 알아내는 방법으로 flag를 얻어낼 수 있습니다.
복호화 코드는 다음과 같습니다.
def ror8(x: int, r: int) -> int:
"""8-bit right rotate (sub_1225)."""
x &= 0xFF
r &= 7
return ((x >> r) | ((x << (8 - r)) & 0xFF)) & 0xFF
def sub_11C9(a1: int) -> int:
"""원본 sub_11C9의 파이썬 구현."""
a1 &= 0xFF
tmp = ((a1 >> 4) | ((a1 * 16) & 0xFF)) & 0xFF
v2 = (((tmp >> 2) & 0x33) | (((tmp * 4) & 0xFF) & 0xCC)) & 0xFF
return (((v2 >> 1) & 0x55) | (((v2 * 2) & 0xFF) & 0xAA)) & 0xFF
def check(a1: int, target: int) -> bool:
"""조건 역산 검사."""
v1 = sub_11C9(a1)
r = ror8(v1, 6) #스테이지에 따라 바뀜
return (r ^ 6) == target #스테이지에 따라 바뀜
if __name__ == "__main__":
target = int(input("TARGET (BYTE5(_libc_start_main) hex): "), 16) & 0xFF
print(f"\n[*] target = 0x{target:02x}")
print("[*] 가능한 a1 후보 탐색 중...\n")
results = []
for a1 in range(256):
if check(a1, target):
results.append(a1)
if not results:
print("[-] 가능한 a1 없음.")
else:
print("[+] 가능한 a1 후보:")
for a1 in results:
c = chr(a1) if 32 <= a1 <= 126 else "."
print(f" a1 = 0x{a1:02x} ({a1:3d}) '{c}'")
print("\n[+] 총 후보 개수:", len(results))
최종 플래그 : ACS{37f1dc32956f6d73a75c4daa3859f46f601cbadfca9ef337f1671d434309109c}
'CTF, Wargame' 카테고리의 다른 글
| [Dreamhack] object Object (0) | 2025.12.30 |
|---|---|
| [Dreamhack] Magnus Carlsen (0) | 2025.12.27 |
| [2025 ACS] web_funable (0) | 2025.11.19 |
| [2025 ACDC] Audio Challenge (0) | 2025.11.15 |
| [hacktheon CTF] Barcode (0) | 2025.09.11 |
