반응형
rev-basic-3
__int64 __fastcall sub_140001000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 0x18; ++i )
{
if ( byte_140003000[i] != (i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i )
return 0i64;
}
return 1i64;
}
byte_140003000[i]
에서 가져온 데이터와 i ^ a1[i] + 2*i
연산의 결과를 비교하고 있다.
즉, byte_140003000[i] == i ^ a1[i] + 2*i
인지 확인하고 비교한다. 따라서, byte_140003000[i]
에 어떤 데이터가 있는지 확인했다.
.data:0000000140003000 byte_140003000 db 49h, 60h, 67h, 74h, 63h, 67h, 42h, 66h, 80h, 78h, 2 dup(69h)
.data:0000000140003000 ; DATA XREF: sub_140001000+28↑o
.data:0000000140003000 db 7Bh, 99h, 6Dh, 88h, 68h, 94h, 9Fh, 8Dh, 4Dh, 0A5h, 9Dh
.data:0000000140003000 db 45h, 8 dup(0)
16진수 데이터가 있는 것을 확인할 수 있다.
그렇다면, 확인한 데이터를 기준으로 if문 연산에 대한 역연산을 수행하면 flag를 획득할 수 있다.
byte_140003000[] - (2*i) ^ i = a1[i]
와 같이 연산하면 flag를 얻을 수 있다.
다음은 연산 및 결과를 출력하는 코드다.
- 필자는 IDA python을 이용함
import idc
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
data = extract_byte_array(0x140003000, 23)
result = ''
idx = 0
for i in data:
result += chr((i-2*idx)^idx)
idx += 1
print(result)
반응형