지난 시간에 이어 리버싱을 풀어볼 것이다
저번과 같이 올바른 입력값을 구하면 된다
먼저 main 함수를 디컴파일한다
검증 과정인 sub_140001000
를 자세히 살펴본다
아마도 비교해야할 값이 있는 byte_140003000
에 가보면 다음과 같은 값이 들어있다
아래의 코드가 입력한 값과 주어진 값을 비교하는 부분이므로 자세히 살펴보자
아래 코드는 파이썬으로 작성된 것인데 직접 작성한 것은 아니고 구글에서 참고했다
내가 직접 코드 작성하는 날이 왔으면 좋겠다..
str='49','60','67','74','63','67','42','66','80','78','69','69','7B','99','6D','88','68','94','9F','8D','4D','A5','9D','45'
res=''
for i in range(24):
res+=chr((int(str[i],16)-(i*2))^i)
print(res)
코드를 돌려보면 다음과 같이 flag 값이 나온다!!
🔑 DH{I_am_X0_xo_Xor_eXcit1ng}
위의 문제와 동일한 형태이다
main을 살펴보고 검증과정인 sub_140001000
에 들어가본다
sub_140001000
을 보면 byte_140003000
과 비교하고 있기 때문에 중요한 값임을 알 수 있다
byte_140003000
를 보면 다음과 같이 문자들이 있다
아래 7번째 줄 코드를 참고하여 정답을 계산하는 파이썬 코드를 작성한다
a1 = [0x24,0x27,0x13,0xC6,0xC6,0x13,0x16, 0xE6,0x47, 0xF5,
0x26, 0x96, 0x47, 0xF5, 0x46, 0x27, 0x13, 0x26,0x26, 0xC6,
0x56, 0xF5, 0xC3,0xC3, 0xF5, 0xE3,0xE3]
for i in range(0, len(a1)):
print(chr(16 * a1[i] & 0xF0 | a1[i] >> 4), end='')
코드를 실행시켜보면 다음과 같이 flag값이 출력된다
🔑 DH{Br1ll1antbit_dr1bble<<_>>}
이번 문제를 새로운 형태인 것 같다
먼저 IDA로 주어진 문제 파일을 열어본다
다음은 WinMain
함수를 디컴파일한 모습이다
🔑 DH{UPATCHED}