
우선 파일을 실행하면 위와 같은 메시지만 반복되다 종료된다.
사실 이 문제는 확인만 존나 누르다가 맨 끝에 나오는 숫자만 보고 정답 인증해도 된다.
하지만 공부하는 입장이니까 존나 분석을 해보도록 한다..

UPX로 패킹되어 있음을 확인할 수 있다.
UPX는 존나게 나왔으니까 쉽게 풀 수 있을 것이다.

그 다음으로 발견되는 IsDebuggerPresent().
간단한 안티 디버깅이니 우회 ㄱㄱ.

반복적으로 메시지 박스를 날려주는 프로그램이니 이 부분을 중점으로 분석하면 될 것 같다... 라고 생각했었다. 시발.
| for (int date = 1; date < ans; date++){ itoa(date, datestr, 10); MessageBox(NULL, datestr, str, MB_OK); } | cs |
그러니까 나는 위와 같은 형태라고 생각했었다.
근데 이 변수(위에서는 int date)를 찾는게 존나게 어려웠다 시발.
내가 풀었던 코드엔진(basic 01~20, advance 01~06) 중에서 가장 어려운 난이도였다..
내가 date를 찾기 위해 썼던 방법은
우선 날짜는 계속 메시지 박스를 통해 출력되니까 메시지 박스에 두 번째 인자값을 중심으로 존나게 디버깅 했다.
두 번째 인자값의 주소는 0x3FF870 이다.
0x3FF870에 메모리 BP를 설치하고 디버깅 ㄱㄱ 하였더니

이런 함수를 발견하였다.
여기서 ESI는 0x3FF2F8 인데, 여기는 바로 int 변수 주소였다!
0x3FF2F8에 있는 값을 문자열로 변환시킨 후 0x3FF870에 저장하는 함수였다.
0x3FF2F8이 내가 생각하는 변수(int date)라 생각하고 메모리 BP 걸고 다시 디버깅 ㄱㄱ.

그러다가 또 0x3FF2F8의 값을 변경하는 부분 발견..
EDI의 값은 0x3F2D78이였다.
그리고 그 주소의 값은 날짜의 값과 동일!
그러니까 결과적으로 0x3F2D78의 값을 0x3FF2F8에 넣고, 그것을 문자열로 변경하여 0x3FF870에 저장한 후 메시지 박스로 출력한 것이다.

0x3F2D78에 메모리 BP를 걸고 디버깅하면 위와 같은 비교문을 발견할 수 있다.
JL을 안 하면 프로그램이 종료된다.
와 슈발. 모든 비교문이 레지스터에 들어가 있어서 존나게 어려웠다.
그냥 엔터만 존나 치다가 끝 숫자 확인하는게 더 빠르다.
ㅈㄴ 어려운 문제 슈발..