CodeEngn Basic RCE L12 문제 확인 성공메시지를 볼 수 있는 key값과 메시지박스에 key값이 나오도록 하려면 파일의 어느 영역을 key값으로 덮어쓰면 되는지를 묻고있다. 파일을 실행시켜 보니 다음과 같이 key값을 입력받고 있다. CodeEngn Basic RCE L12 풀이 문자열들을 보니 성공메시지와 관련한 문자열 "Congtratulation~"이 보인다. 해당 함수가 사용되는 함수로 가보니 성공메시지가 출력되려면 eax가 0x7A2896BF 여야 한다. 일단 key값으로 '123'을 줘보았다. GetDlgItemInt는 정수 입력값만 받기 때문에 그 외의 값을 주면 리턴값이 0이 되고 정수값이면 리턴값이 입력값이 된다. 123(0x7B)를 입력으로 주었기 때문에 eax에 0x7B..
CodeEngn Basic RCE L07 문제 확인 컴퓨터 C 드라이브의 이름이 CodeEngn일 경우 시리얼이 생성되는데 시리얼 생성 과정에서 CodeEngn이 뭐로 변경되는지를 묻고 있다. C 드라이브 이름을 가져온는 것과 관련된 윈도우 API가 사용될 것이고 가져온 이름을 사용해서 시리얼을 생성하나보다. 아래와 같이 시리얼을 입력받고 있다. CodeEngn Basic RCE L07 분석 시리얼을 맞게 입력했다는 문자열이 사용되는 함수로 먼저 가본다. 해당 함수로 가보니 GetVolumeInformationA라는 C드라이브의 이름을 가져올 것만 같은 API가 쓰이고 있다. 그리고 인자를 여러개 받는데 두번째 인자로 VolumeNameBuffer가 push되고 있다. 이 변수에 C 드라이브 이름이 저장..
CodeEngn Basic RCE E06 풀이 언팩 과정에서 OEP를 찾고, 시리얼도 추가적으로 찾는 문제이다. 파일을 실행시켜 보니, 아래와 같이 시리얼을 입력받도록 되어있다. CodeEngn Basic RCE L06 분석 수동 언패킹 과정은 L05 문제에서 했던 방법과 같다. upx 패킹은 초반에 아래와 같이 pushad로 레지스터 정보를 스택에 전부 백업해놓는다. 그리고 아래와 같이 명령어 찾기로 popad를 찾아주고 실행시켜보면, 백업해두었던 스택의 레지스터 값들이 전부 복원된 것을 볼 수 있다. 그리고 그 밑에 jmp에 bp를 걸어주고 실행시킨 후 jmp하는 위치로 가보자. 이렇게 OEP를 찾을 수 있다. 수동으로 언팩을 하려면 OEP, IAT, Imports를 맞춰주어야 하는데 다행히도 X32..
CodeEngn Basic RCE E05 문제 확인 등록키를 찾아내는 문제이다. Register을 누르면 잘못된 시리얼이라며 다시하라는 경고창이 뜬다. CodeEngn Basic RCE E05 분석 IDA로 열어보니 해당 바이너리는 UPX 패킹이 되었음을 알 수 있다. UPX는 매우 간단한 패킹이기 때문에 툴을 사용하면 금방 언팩할 수 있지만, 수동으로 OEP를 찾고 덤프를 떠보려 한다. 대부분의 패킹 알고리즘은 처음에 pushad로 레지스터들의 현재 상태를 스택에 전부 백업을 시켜둔다. 아래 스택창을 보면 EDI부터 EAX까지 스택에 저장되었음을 알 수 있다. 그럼, popad를 하면 백업해둔 레지스터들이 그대로 복원된다. popad를 한다음 OEP(Original EP)로 뛰는 경우가 많기 때문에 p..
CodeEngn Basic RCE L04 문제 확인 해당 프로그램에 걸려있는 안티디버깅 함수 이름을 찾아내는 문제이다. CodeEngn Basic RCE L04 분석 IDA로 확인해보니, IsDbuggerPresent 함수가 임포트되어 있다. 호출하는 곳을 살펴보니 그냥 main에서 호출되고 있다. IsDebuggerPresent 함수 호출 후에 'test eax eax'로 eax 반환값이 0인지 확인하고 있다. 0이라면 오른쪽 분기를 타게 된다. IsDebuggerPresent 함수 호출 부분으로 가서 직접 반환값을 확인해보자. 호출 후 EAX를 확인하니 1이다. 위에서 0인 경우를 확인하고 있었으니 디버깅 중인 경우에는 반환값이 1이고 아닌 경우에는 0인 모양이다. 당연하게도 그냥 실행시켜보면 디버깅..
CodeEngn Basic RCE L03 문제 확인 비주얼베이직에서 스트링 비교 함수를 묻고있다. 구글링으로도 알 수 있지만, 공부하는 입장이므로 분석을 수행해보자. 처음엔 다음과 같이 dll이 없다고 떠서 이것부터 문제인 줄 알았다. 그래서 IDA에서 string 관련 함수를 확인했는데 vba 관련 여러 함수 중에서 vbaStrCmp라는 함수가 눈에 띈다. 어쨋든 dll은 설치해주면 되는 문제였다. dll을 설치하고 나면 아래와 같이 정상적인 UI를 확인할 수 있다. Regcode를 입력받고 있기 때문에 Registrieren을 클릭하면 입력해준 코드가 유효한 코드인지 확인하는 작업을 거칠 것이다. CodeEngn Basic RCE L03 분석 확인해준 함수가 실제로 실행이 되는지 확인하기 위해 imp..
CodeEngn Basic RCE L02 문제 확인 패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겨 패스워드를 찾아내야 하는 문제이다. 실행파일이 손상되었기 때문에 다음과 같이 실행이 되지 않는다. CodeEngn Basic RCE L02 분석 IDA로 확인해보려 했는데, 패킹되어있는 파일이라 어셈 코드를 정확히 볼 수 없다. 실행이 되도록 만드는게 문제의 목적인 것 같지만 그냥 HxD로 들어있는 문자열을 확인해보자. 분기문 후 경고창에 나올것 같은 문자열과 함께 패스워드스러워 보이는 문자열이 존재한다.
2016년에 작성했던 풀이를 현재 블로그에 옮깁니다(하루에 2~3개씩 옮길 예정). CodeEngn Basic RCE L01 문제 확인 HDD를 CD-Rom으로 인식시키기 위한 GetDriveTypeA의 리턴값을 묻고 있다. 드라이브 타입을 얻어오는 GetDriveTypeA 함수 호출 부분 위주로 분석해보면 될 것 같다. CodeEngn Basic RCE L01 문제 풀이 실행파일을 실행시켜보니 'Make me think your HD is a CD-Rom'이라는 경고창이 뜬다. 사실 이 문제는, GetDriveTypeA API의 반환값만 살펴봐도 풀리는 문제이다. CD-ROM으로 인식되야 하기 때문에 반환값은 '5'여야 한다. 하지만, 공부하는 입장이므로 좀더 살펴보자. 아래 분기를 보면, GetDri..