Description
Category: Reversing
Source: wargame.kr
Points: 376
Author: Jisoon Park(js00n.park)
Description:
Simple Reverse Engineering Challenge.
Write-up
실행파일이 주어지고, 실행해보면 뭔가 숫자를 입력하고 auth를 해야하는것 같다.
아무거나 넣어보면 wrong password라고 얘기해준다.
decompile을 시도한 후 wrong password 문자열을 찾아본다.
이 문자열을 사용하는 함수를 디컴파일 해보면 대충 아래와 같은 코드를 얻을 수 있다.
//(생략...)
Time = _time64(0);
v2 = *((_DWORD *)v1 + 29);
v3 = (const wchar_t **)((char *)v1 + 116);
v4 = *(_DWORD *)(v2 - 12);
if ( ((1 - *(_DWORD *)(v2 - 16 + 12)) | (*(_DWORD *)(v2 - 16 + 8) - v4)) < 0 )
((void (__stdcall *)(int))sub_C22420)(v4);
v5 = _wtoi(*v3);
if ( _localtime64_s(&Tm, &Time) )
v6 = 0;
else
v6 = Tm.tm_mon + 1;
if ( 0xFFFCECC9 * v6 + v5 == 0xBADBABE )
{
AfxMessageBox(L"congratulations! Authentication key is .....", 0, 0);
//(생략...)
_wtoi() 함수를 이용하는걸 보면 keypad로 입력한 값이 v5에 저장되는것 같다.
if문을 true로 만드려면 v6를 알아야 하는데, v6는 _locatime64_s() 함수의 리턴값과 동작 내용으로 알아낼 수 있을 것 같다.
MS api 페이지를 참조해보면, _locatime64_s() 함수는 시간 데이터를 구조체에 채워주고, 성공하면 0을 리턴한다고 한다. 뭐 이런 시스템 함수가 실패할거 같지는 않고, else 절을 보면 Tm.tm_mon을 이용하는데, 지금이 12월이니 11이 될것 같다.(보통 month 데이터는 0~11로 표현되니까)
v6 = 11 + 1 = 12가 될거고, 이걸로 if 문을 만족시키는 v5를 역산해 보면 0xbd2a152를 얻을 수 있다. 이를 decimal로 변환하여 198353234를 입력하면 keypad 하단의 입력창에서 flag를 얻을 수 있다.
Flag : 1567d027bf68fc0ab316728628e8ed3a45189ef8
그냥 대충 위치만 잡고 디버거에서 if-true branch를 타도록 해도 될거 같았지만 그냥 리버싱 연습하는 의미에서 간단하게나마 코드 분석으로 진행했다.
'writeups > Reversing' 카테고리의 다른 글
Cr4ckZ33C0d3 (0) | 2019.11.23 |
---|---|
Cheesy (0) | 2019.11.23 |
flag (0) | 2019.11.23 |
DLL with notepad (0) | 2019.11.23 |
baby-re (0) | 2019.11.23 |