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 |