이 프로그램은 몇 밀리세컨드 후에 종료 되는가
타이머관련 함수나 Sleep 함수를 사용하려나 유추가 된다.
프로그램 실행화면
잘 움직이는걸 봐선 Sleep 함수는 쓰지 않는다.
x32Dbg - 수동언패킹
이녀석 패킹이 되어있구나 !
그냥 진행해보자
popad 가 보이고 밑에 jmp가 보이는 걸로 봐서 이 프로그램은
UPX 패킹이 된걸 알 수 있다.
417770 이 OEP 겠구나.
OEP 로 도착했다.
이제 분석해보자
안티디버깅 우회
?? AutoIt 이라는 녀석으로 만들어 진 프로그램인거 같고 메세지를 뿜으며 종료된다.
step over로 진행해보니 call 40ea50 부분에서 메세지박스를 띄우는 걸 알 수 있다.
step into 로 40ea50 을 타고 들어가보자
타고 들어와 step over로 진행 해보자
call 40e940 에서 메세지를 띄운다. 다시 해당 주소로 타고 들어가자
IsDebuggerPresent 함수가 보인다.
안티디버깅이 적용되어있다. 분기 인스트럭션인 jne 4338de를 타고가서 확인해보자
메세지박스의 내용이 적혀있다.
해당 프로그램은 안티디버깅 기법이 적용되어 있으며, 무력화해주도록 하자.
IsDebuggerPresent 함수를 호출하는 부분을 xor eax, eax 해주고 남는 곳은 nop으로 메워주니
안티디버깅 우회가 되었다.
그냥 nop 처리를 해주거나, jne -> je 로 바꿔주거나, mov eax, 0 으로도 가능하다.
eax 레지스터를 바꿔줄수도 있겠고 개인이 하기 나름이다.
밀리세컨드 찾기
타이머 관련 함수인 SetTimer를 찾아주었다.
2EE 40 28 을 각각 가지지만 정답이 아니다.
IDA
IDA로 넘어와 Time 관련 함수를 검색해주었다.
timeGetTime 이 보인다. 의심스럽다.
해당 함수를 참조하는 곳을 보자, 전부 call 해주고 있지만 edi 에 저장해주는 곳이 보이니 저기로 이동하자
밑의 분기점이 보인다.
브레이크 포인트를 걸어주고 진행
ebx 에 8AF878 이 저장된다. 8AF878 + 4 주소에 어떤 값이 들어있는지 확인하자
70 2B 가 들어있고 리틀엔디언이니 2B 70 이 된다.
Decimal 변환시 11120이 나오고
1000ms = 1초 가된다.
정답은 11.12초.
의심스러운걸 확인해가며 진행한거 같다. 처음부터 IDA를 썼다면 더 편했을거 같기도..
'Reverse Engineering > [CodeEngn] Basic RCE' 카테고리의 다른 글
[Reversing] CodeEngn - Basic RCE L20 (0) | 2024.07.04 |
---|---|
[Reversing] CodeEngn - Basic RCE L18 (0) | 2024.07.03 |
[Reversing] CodeEngn - Basic RCE L17 (0) | 2024.07.03 |
[Reversing] CodeEngn - Basic RCE L16 (0) | 2024.07.02 |
[Reversing] CodeEngn - Basic RCE L15 (0) | 2024.07.02 |