woonadz :)

[DreamHack] basic_rev_4 문제 풀이_reversing_nabi 본문

IT/DreamHack

[DreamHack] basic_rev_4 문제 풀이_reversing_nabi

C_scorch 2023. 4. 5. 19:32
반응형

문제

 

 

DreamHack의 basic reversing 시리즈는 전체적인 로직은 같고, 입력값을 기반으로 serial과 비교하는 부분의 로직이 다르기 때문에 그 부분부터 설명한다.

 

1C와 비교하는 것으로 보아 총 28자리의 serial인 것을 추측할 수 있다.

 

sar 명령어는 오늘 처음 보았다.

sar : 오른쪽으로 밀어 낮은  bit를 내보내고 Carry Flag로 복사, 높은 bit 쪽에 0을 더하여 채운다.

But keep sign(1) 해야한다.

사용자가 입력한 첫 값에 대해 위와 같이 계산한다.

 

shl : 왼쪽으로 밀어(shift) 높은 bit를 내보내고 Carry Flag로 복사 낮은 bit쪽에 0을 더하여 채운다.

사용자가 입력한 첫 값에 대해 위와 같이 계산한다.

 

shl 연산을 한 값과 F0을 and 연산한다.

 

eax 레지스터의 값과 ecx 레지스터의 값을 or 연산한다.

 

위에서 연산한 값과 00007FF63C673000 주소에 있는 값들을 비교해서 점프 여부를 정한다.

 

해당 주소로 가서 28자리의 비트 수를 확인한다. 위 값을 기반으로 코드를 짤 것이다.

00007FF63C673000 24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27 $'.ÆÆ..æGõ&.GõF'

00007FF63C673010 13 26 26 C6 56 F5 C3 C3 F5 E3 E3 00                    .&&ÆVõÃÃõãã.

 

 

역으로 계산하면 다음과 같다.

M = 메모리 값

A = 사용자 입력값

(A → 오른쪽으로 비트 수 한자리 이동) or {(A → 왼쪽으로 비트 수 한자리 이동) and F0} = M

or의 역연산은 불가능하기 때문에 A를 변수로 두고 burteforce 방식으로 M이 되는 값을 찾는 코드를 작성했다.

 

사진을 보면 사용자가 입력할 수 있는 값은 10진수 기준으로 33부터 126까지이다.

 

encrypted = [0x24, 0x27, 0x13, 0xC6, 0xC6, 0x13, 0x16, 0xE6, 0x47, 0xF5, 0x26, 0x96, 0x47, 0xF5, 0x46, 0x27, 0x13, 0x26, 0x26, 0xC6, 0x56, 0xF5, 0xC3, 0xC3, 0xF5, 0xE3, 0xE3, 0x00]

for j in range(0,28):
    for i in range(32,127):
        if (i >> 4) | ((i << 4) & 0xF0) == encrypted[j]:
            print(chr(i), end='')
            break;

 

 

flag

반응형