Dreamhack/Reversing

[Reversing] rev-basic-5 문제 풀이

壓倒 2023. 1. 9. 16:43

문제


Reversing Basic Challenge #5(dreamhack)

정적 분석


해당 문제도 특정 문자열을 입력받아 compare_fun() 함수의 리턴 값이 1이 되면 해결되는 문제이다.

main 함수(dreamhack)

compare_fun() 함수는 i 번째 입력 값(a1)과 i+1 번째 입력 값(a1+1) 을 더한 값이 byte_140003000[i] 값과 일치해야 한다.

compare_fun()

byte_140003000의 byte 값을 추출하기 위해 다음과 같은 코드를 입력한다.

print(list(ida_bytes.get_bytes(here(), 24)))

위의 코드로 추출된 byte_140003000의 값은 다음과 같다.

[173, 216, 203, 203, 157, 151, 203, 196, 146, 161, 210, 215, 210, 214, 168, 165, 220, 199, 173, 163, 161, 152, 76, 0]

풀이 방법

내가 생각한 풀이 방법은 i+1번째 byte 배열 값에서 i 번째 byte 배열 값의 차이를 반복문을 통해 계속 뺄셈 연산을 한다면 Flag가 최종적으로 출력될 것이라고 생각하였다.

compare_fun 함수(https://esyeonge.tistory.com/74)
i+1번째 byte 배열 값에서 i 번째 byte 배열 값의 차이가 Flag일까? 마지막 byte 배열의 값이 0이기 때문에 i+1 번째에서 i번째를 빼주게 된다면 i 번째의 Flag 값이 나오게 된다.

최종 풀이 코드는 다음과 같다.

hex_list = [173, 216, 203, 203, 157, 151, 203, 196, 146, 161, 210, 215, 210, 214, 168, 165, 220, 199, 173, 163, 161, 152, 76, 0]
result_list = []
temp = abs(hex_list[23] - hex_list[22])
temp = 76
result_list.append(76) # 23번째 인덱스 값 - 22번째 인덱스 값
for i in reversed(range(22)):
    temp = hex_list[i] - temp # 차이 값을 구하고 재귀적으로 대입
    result_list.append(hex_list[i]-temp)
print(result_list)
for a in reversed(range(23)):
    print(chr(result_list[a]), end='')

해당 코드를 실행할 시 정확한 Flag는 출력되지 않고 A문자열이 빠진 ll_l1fe_3nds_w1th_NULL} 가 출력되게 된다.

실제로 Flag를 입력할 때 A일 것이라고 추측을 하여 해결할 수 있었으며 정확한 코드 구현 또한 추후 진행할 예정이다.

Flag


DH{All_l1fe_3nds_w1th_NULL}

오류, 잘못된 점 또는 궁금한 점이 있으시다면 댓글 남겨주세요❗


Uploaded by N2T