호그와트

드림핵 rev-basic-5

영웅*^%&$ 2022. 1. 28. 15:01
728x90

IDA를 통해 검증하는 함수를 보면

__int64 __fastcall sub_140001000(__int64 a1)

{

int i; // [rsp+0h] [rbp-18h]

for ( i = 0; (unsigned __int64)i < 0x18; ++i )

{

if ( *(unsigned __int8 *)(a1 + i + 1) + *(unsigned __int8 *)(a1 + i) != byte_140003000[i] )

return 0i64;

}

return 1i64;

}

사용자 입력값을 a 라고 했을 때, a[n] 과 a[n+1] 을 더한 값이 byte_140003000 값과 같아야 한다고 한다.

byte_140003000 의 모습은 아래와 같은데, 이전 코드와의 모습을 볼 때 이것도 하나의 배열이고, 결국 배열끼리의

연산임을 알 수 있었다.

.data:0000000140003000 byte_140003000 db 0ADh, 0D8h, 2 dup(0CBh), 9Dh, 97h, 0CBh, 0C4h, 92h

.data:0000000140003000 ; DATA XREF: sub_140001000+48↑o

.data:0000000140003000 db 0A1h, 0D2h, 0D7h, 0D2h, 0D6h, 0A8h, 0A5h, 0DCh, 0C7h

.data:0000000140003000 db 0ADh, 0A3h, 0A1h, 98h, 4Ch, 9 dup(0)

0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3, 0xA1, 0x98, 0x4C, 0x0

여기서 한 가지 값을 알면 나머지 값도 순서대로 유추해낼 수 있다

첫 번째 값을 처음부터 아는 것은 어려운 일이지만, 마지막을 더해서 0이므로 마지막 값이 0인 것을 바로 알아챌 수 있다. 여기서부터 역으로 추론해서 전체 값을 알면 된다

역산식을 세울 수 있는 원리를 발견하였으므로, 이 작업을 뒤에서부터 해 줄 코드를 작성했다. 따라서 뒤에서부터 거꾸로 역산을 해 주면 된다. 사용자의 입력값이 조건을 통과하면 그것이 바로 flag가 된다.

origin = 'AD D8 CB CB 9D 97 CB C4 92 A1 D2 D7 D2 D6 A8 A5 DC C7 AD A3 A1 98 4C 00'

origin = hehehehehe

panda = aflijaljeflja

for init in range(0, 128):

error

nop

try:

result = chr(init)

before = init

for i in origin:

result +=~!@~!#@!#~#

before = ~~~~

print(result)

except Exception as e:

# print(e)

continue

728x90

'호그와트' 카테고리의 다른 글

드림핵 rev-basic-7  (0) 2022.01.28
드림핵 rev-basic-6  (0) 2022.01.28
드림핵 funjs  (0) 2022.01.26
드림핵 rev-basic-0  (0) 2022.01.25
드림핵 rev-basic-1  (0) 2022.01.25