반응형
rev-basic-8
__int64 __fastcall sub_140001000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 0x15; ++i )
{
if ( (unsigned __int8)(-5 * *(_BYTE *)(a1 + i)) != byte_140003000[i] )
return 0i64;
}
return 1i64;
}
a1[i] * -5 == byte_140003000[i]
을 만족하는 a1[i]
를 구하는 문제다.
단순한 방법은 a1[i] == byte_140003000[i] / -5
를 연산해서 a1[i]
를 구하는 것이다. 그러나 단순하게 생각해서 구현하면 a1[i]
을 구할 수 없다.
- 이유는 if문을 보면
a1[i] * -5
연산 후에(unsigned __int8)
로 형변환을 수행하기 때문이다. - 즉, 형변환까지 고려해서
a1[i]
을 구해야한다.
역연산으로 byte_140003000[i]
부터 a1[i]
를 구하려고 여러가지 시도를 해봤지만 방법이 없었다.
하지만
(unsigned __int8)(a1[i] * -5) == byte_140003000[i]
조건을 직접 코드로 작성하는 것은 어렵지 않다. 또한 a1[i]
가 flag이므로 ascii 영역의 데이터일 것이다.
그렇다면 간단하게 위 조건을 코드로 구현하고 ascii 범위의 값들로 브루트포싱해서 1자리씩 값을 구한다면, 오랜 시간이 걸리지 않고도 충분히 flag를 구할 수 있다.
필자는 IDApython으로 풀었다.
import idc
import numpy as np
def extract_byte_array(start_address, length):
extracted_data = []
for i in range(length):
byte_value = idc.get_wide_byte(start_address + i)
extracted_data.append(byte_value)
return extracted_data
arr = extract_byte_array(0x140003000, 32)
for i in range(len(arr)):
for j in range(255):
if np.uint8(-5*j) == arr[i]:
print(chr(j), end='')
break
반응형