본문 바로가기

Hacking/Reversing

CodeEngn_basic_19

Basic RCE L19

 

이 프로그램은 몇 밀리세컨드 후에 종료 되는가

 


 

이 프로그램은 몇 밀리세컨드 후에 종료 되는가.. 라는 문제인데, 프로그램이 자동으로 일정 시간 후에 종료되는 프로그램인 것 같으니 동적 분석은 딱히 할 필요가 없는 것 같네요, 그래도 한번 실행은 시켜봅시다.

UPX패킹이 되어있으니 언패킹해주시고..

 

 

이런창이 뜨고 얼마 뒤에 자동으로 꺼진다.

 


 

가장 먼저 Ollydbg로 파일을 연 뒤에 실행을 시켜보니 디버거를 감지하는 함수에 걸렸다고 에러가 발생한다.

그런 함수는 대게 Isdebugger라는 함수이니  함수를 호출하는 부분을 봅시다.

 

 

함수 호출하는 부분에서 위로 올라가다보면 IsDebuggerPresent라는 함수가 보이는데 이 부분에 BP를 걸고 들어가보면 약간 아래쪽에서 점프문을 진행하는데 이부분을 수정해주면 디버거를 감지하지 못하게 됩니다.

( IsDebuggerPresent 라는 함수는 여러개 있으니 맞는 것을 찾아야 한다. )

( JNZ -> JZ )

 

 

디버거 감지는 해결했으니 이제 본격적으로 몇 밀리세컨드만에 종료되는지 알기 위해서는 시간과 관련된 함수를 호출하는 부분을 찾아야 하는데, IsDebuggerPresent를 찾으러 위로 올리면서 시간과 관련된 함수 몇 개를 눈 여겨 뒀는데 바로 TimeGetTime과 Sleep라는 함수를 적어뒀네요.

우선은 TimeGetTime함수중에서 있는 확인하기 위해서 해당 함수의 이름을 가진 모든 부분에 BP를 걸어봅시다.

 

그 후에 실행을 시켜봤는데 저 중에서 하나의 TimeGetTime함수에 걸렸네요, 이 부분에서 한번 찾아봅시다.

 

 

해당 함수에 들어가서 해석을 해보니 이 부분이 타이머 역할인듯 하네요, 해석을 해 봅시다.

 

Call EDI TimeGetTime함수 호출
CMP BYTE PTR DS:[48E8D3], 0 48E8D3주소의 값과 0을 비교
MOV ESI, EAX ESI = EAX
JE 19.00444D54 48E8D3과 0의 값이 같다면 00444D54부분으로 점프
// 이 부분에서 시간이 다되었다면 끝내는 듯 하다.
MOV EBX, DWORD PTR SS:[ESP+14] EBX = [ESP+14]
MOV EBP, DWORD PTR DS:[<&KERNEL32.Sleep> EBP = Sleep함수 주소
CALL EDI EDI의 주소 호출
CMP EAX, ESI EAX와 ESI 비교
( EAX = EDI함수의 반환값 )
JNB 19.00444D38 EAX >= ESI라면 00444D38부분으로 점프
SUB EAX, ESI EAX -= ESI
DEC EAX EAX -= 1
JMP 19.00444D3A 00444D3A부분으로 점프
SUB EAX, ESI EAX -= ESI
CMP EAX, DWORD PRT DS:[EBX+4] EAX와 EBX+4주소의 값 비교
JNB 19.00444C71 EAX >= EBX+4 일 때 00444C71부분으로 점프

 

이렇게 되는데 ( 맞는지 확실하진 않지만? ) 

코드를 죽 내리다 보면 무조건 점프를 하는 부분이 있는데 이 부분에서 CMP EAX, DWORD PRT DS:[EBX+4]로 이동하는 걸 보면 EAX와 EBX+4를 비교해서 끝내는 것 같네요, 요 부분으로 가서 값을 확인해 봅시다. 

 

 

0이랑 2B70이라는 값을 비교하네요, 0일리는 없으니 2B70으로 답을 입력해봅시다.

정답이네요.

'Hacking > Reversing' 카테고리의 다른 글

CodeEngn_basic_20  (0) 2020.08.10
CodeEngn_basic_18  (0) 2020.07.24
CodeEngn_basic_17  (0) 2020.07.24
CodeEngn_basic_16  (0) 2020.07.18
CodeEngn_basic_15  (0) 2020.07.13