Dream Hack write-up(3)

BigTree·2023년 5월 4일
0
post-thumbnail

사실 4주차 과제를 할 생각이 없었다. 그런데 갑자기 마감이 오늘까지라는 이야기를 들어서... 그냥 하기로 했다. 벌금을 좀 아껴보자 오늘도 리버싱 문제를 3개 풀어보려고 한다. 지금 시간은 13시 41분. 마감은 6시 30분까지다. 화이팅 나새끼

rev-basic-2

🍇LEVEL 1 : Reversing

문제
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!
획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.

지난 포스팅의 1번 문제와 동일하게 IDA를 이용하여 디컴파일을 진행한다.
https://velog.io/@jh_0517/Dream-Hack-write-up2
디컴파일을 진행하면 아래와 같은 메인 함수를 얻을 수 있다.
sub_140001000으로 이동하면 조건에 대해 알 수 있다. ac에 저장된 값과 입력한 값을 비교하고 값이 일치하면 Correct가 출력됨을 알 수 있다. aC로 이동해서 저장된 값을 알아보자. 이동하면 140003000의 주소가 기록되어있다. 4byte에 저장된 값을 나열하면 'Comp4re_the_arr4y'임을 알 수 있다.

flag = DH{Comp4re_the_arr4y}

rev-basic-3

🍇LEVEL 1 : Reversing

문제
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!
획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.

디컴파일을 진행하면 아래와 같은 메인 함수를 얻을 수 있다.

line 8의 if는 (unsigned int)sub_140001000(v4)이 true 값을 가지면 Correct를 출력한다. 해당 함수를 따라가면 이와 같은 함수를 확인할 수 있다.

자세히 읽어보면 140003000의 주소에 저장된 1-24번째 값을 읽으며, 입력받은 값을 연산한 후 비교하는 간단한 코드이다.
일단 140003000에 저장된 값을 찾아보자.

[49, 60, 69, 74, 36, 37, 42, 66, 80, 78, 69, 69, 7B, 99, 6D, 88, 68, 94, 9F, 8D, 4D, A5, 9D, 45]의 값을 가지고 있다.

해당 값에 i^(입력값[i]) + (2i)의 역연산을 진행하면 원하는 값을 알 수 있다. 즉, (저장된 값[i]-(2i)) ^ i연산을 진행하여 flag를 찾으면 된다.

[ 코드 ]

value = ['49','60','67','74','63','67','42','66','80','78','69','69','7B','99','6D','88','68','94','9F','8D','4D','A5','9D','45']
flag = ''

for i in range(23):
    flag += chr((int(value[i], 16) - (2*i)) ^ i)

print(flag)

flag : DH{I_am_X0_xo_Xor_eXcit1ng}

rev-basic-4

🍇LEVEL 1 : Reversing

문제
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 알아내세요.
획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.

똑같은 사진이 3개째...
앞의 문제와 똑같이 sub_140001000함수를 확인해보자.
다... 똑같고 그 식이 죅금 복잡해졌다.
저장된 값은옮겨쓰기 귀찮다 ['24', '27', '13', 'C6', 'C6', '13', '16', 'E6', '47', 'F5', '26', '96', '47', 'F5', '46', '27', '13', '26', '26', 'C6', '56', 'C3', 'C3', 'F5', 'E3', 'E3'] 이다.

16X 입력값[i] | 입력값[i]>>4를 역 연산하면 flag를 찾을 수 있다.
입력값[i]를 0x24라고 할 때, 16X입력값[i]의 값은 02 40가 된다. 입력값[i]>>4는 0x02가 된다. 02 40 | 02의 값은 0x42가 된다. 따라서 저장된 값의 첫번째 수와 두번째 수를 바꾼 다음 출력하면 flag를 얻을 수 있다.

value = ['24', '27', '13', 'C6', 'C6', '13', '16', 'E6', '47', 'F5', '26', '96', '47', 'F5', '46', '27', '13', '26', '26', 'C6', '56', 'F5', 'C3', 'C3', 'F5', 'E3', 'E3']
flag = ''

for i in range(len(value)):
    flag += chr(int(value[i][1]+value[i][0], 16))

print(flag)

flag : 글씨로 쓰면 언더스코어가 안보인다...

문제가 다... 너무 똑같다. 약간 양심이 찔리지만 1시간 30분만에 과제 다 해서 행복하다. 리버싱은 가성비가 좋구나

0개의 댓글