본문 바로가기

Study/Reverse Engineering

dreamhack : rev-basic-8 write-up

728x90

https://dreamhack.io/wargame/challenges/22

 

rev-basic-8

Reversing Basic Challenge #8 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출

dreamhack.io

 

step1. main 함수 분석

입력을 받고, 해당 값이 맞으면 "Correct" 틀리면 "Wrong" 출력

 

step2. main 함수 내부 함수 분석

sub_140001000함수

 

if문에 (unsigned __int8)(-5**(_BYTE *)(a1+i)) != byte_140003000[i]가 거짓이겠끔 파이썬을 구현해줘야함

 

step3. 역연산

unsigned __int8은 0~255 범위의 값을 가지는 것을 의미

-5를 곱한 후에 이 범위로 & 0xFF 사용해서 변환해야함

 

먼저 byte_140003000 데이터 export하기!!

data는 아래와 같음 

 

byte_140003000[i]를 기준으로 a1[i] 값을 역연산해서 result리스트에 저장하고 바이트 배열로 변환해서 출력하면 된다.

byte_140003000 = bytes.fromhex("AC F3 0C 25 A3 10 B7 25 16 C6 B7 BC 07 25 02 D5 C6 11 07 C5 00 00 00 00 00 00 00 00 00 00 00 00")

result = []

for i in range(len(byte_140003000)):
    # (unsigned __int8)(-5 * a1[i]) == byte_140003000[i]
    # a1[i]를 찾기 위해 식을 역산
    # -5 * a1[i] = byte_140003000[i]
    # a1[i] = -byte_140003000[i] / 5

    # a1[i] = -byte_140003000[i] // 5 를 unsigned int 8로 변환
    a1_i = ((-byte_140003000[i]) * pow(5, -1, 256)) & 0xFF  # 5의 모듈러 역수를 곱하고 256으로 모듈러

    result.append(a1_i)

result = bytes(result)

print(result)

 

 

'Study > Reverse Engineering' 카테고리의 다른 글

dreamhack : Collect Me writeup  (1) 2024.06.03
dreamhack : secure-mail writeup  (2) 2024.06.01
dreamhack : rev-basic-6 writeup  (0) 2024.05.30
dreamhack : rev-basic-4 write-up  (1) 2024.05.29
dreamhack : rev-basic-2 write-up  (0) 2024.05.15