본문 바로가기

CTF/SWING CTF 2022

[Rev] Snail

snail.zip
0.01MB

 

다운받아서 압축을 풀고 나온 exe 파일을 IDA에 넣었는데...

아...

아까부터 대체 왜 이러지.

 

파일 실행도 안되는데 뭘 할 수 있나 싶지만,

이러다 갯수를 못 채우는 희대의 불상사가 벌어지게 생겼기 때문에

Write-up에 있는 코드라도 보고 뭐라도 해보자겠다.

 

플래그를 생성하는 바이너리가 주어진다.

두 가지 파트로 나눠서 생성하는데, 아래는 첫 번쨰 파트의 부분이다.

printf("SWING{");
for ( i = 0; i < 100; i += 17 )
{
v3 = fibo(i);
printf("%llu", v3);
}

printf와 반복문 코드를 보니 C언어인가 보다.

for문을 range(0, 100, 17)로 0부터 100보다 작을 때까지 17씩 증가하며, 그러니까 0부터 85까지 5번 돌고 각각의 피보나치 값을 구한다.

피보나치 구현은 아래 코드와 같이 되어있다.

__int64 __fastcall fibo(int a1)
{
__int64 v1; // rax
__int64 v3; // [rsp+20h] [rbp-18h]
Sleep(1000 * a1);
if ( !(unsigned __int8)is_lower_than_2(a1) )
return 1i64;
v3 = fibo(a1 - 2);
v1 = fibo(a1 - 1);
return sum(v1, v3);
}

if문 안에 있는 것이 비트 연산으로 2보다 작은지 확인한다.

sum함수는 비트 연산으로 구현된 덧셈이다.

 

함수 초반에서 Sleep을 호출하고 재귀함수로 계산하기 때문에 작동이 매우 느리다.

직접 반복문으로 구현하여 빠르게 값을 구하도록 한다.

 

두 번째 파트는 아래와 같다.

for ( j = 0; j < 256; ++j )
{
v16[j] = j;
Sleep(1000 * j);
}
v7 = 0;
LOBYTE(v9) = 0;
while ( v7 < 256 )
{
v9 = (unsigned __int8)(aThisIsSuperKey[v7 % 18] + v16[v7] + v9);
Sleep(1000 * (unsigned __int8)v16[v7]);
v12 = v16[v9] ^ v16[v7];
v16[v7] = v12;
v13 = v12 ^ v16[v9];
v16[v9] = v13;
v16[v7] ^= v13;
Sleep(1000 * (unsigned __int8)v16[v7++]);
}
LOBYTE(v10) = 0;
for ( k = 0; k < 33; v17[k - 1] ^= v11 )
{
k = (unsigned __int8)(k + 1);
v10 = (unsigned __int8)(v16[k] + v10);
Sleep(1000 * (unsigned __int8)v16[k]);
v14 = v16[v10] ^ v16[k];
v16[k] = v14;
v15 = v14 ^ v16[v10];
v16[v10] = v15;
v16[k] ^= v15;
Sleep(1000 * (unsigned __int8)v16[k]);
v11 = v16[(unsigned __int8)(v16[v10] + v16[k])];
Sleep(1000 * v11);
}
printf("_%s", v17);
puts(asc_140004038);

1. Sleep 어쩌구 하는 부분의 바이너리를 패치하거나,

2. aThisIsSuperKey 값을 이용해서 RC4 연산하면 된다.

 

단순히 RC4 암호에 대한 구현에 Sleep을 추가한 것이기 때문에

스택에 지역변수로 존재하는 암호문과 rodata 영역에 존재하는 키를 사용하면 플래그의 두 번째 파트를 구할 수 있다.

 

patch를 하는 방법이 더 간단한데 실행이 안되네...

Sleep 을 NOP 어셈블리어로 바꾸면 Sleep이 호출이 안되어서 바로 플래그를 얻을 수 있다.

 

IDA로 코드 패치 하는법 (리눅스도 가능) : 네이버 블로그 (naver.com)

어셈블리 코드와 숨겨진 NOP : 네이버 블로그 (naver.com)

 

나중에 실행 방법을 알아내면 저런거 참고해서 잘 패치해서 해결해보자.

 

FLAG :

SWING{12584922746532951280099117669030460994420196140727489673_Th1s_b1n4ry_1S_sUp3R_sL0w_rIghT??}

 

'CTF > SWING CTF 2022' 카테고리의 다른 글

[Web] babyxss  (0) 2022.12.04
[Web] Baby Sign  (0) 2022.12.04
[Rev] Ransomware  (0) 2022.12.03
[Rev] OPEN THE DOOR  (0) 2022.12.03
[Misc] QR Discovery  (0) 2022.11.18