드디어 코드엔진 Basic RCE 마지막 문제이다. 2017년도에 풀었던 풀이를 옮기는데 이상하게 생각한 것도 있고 별로 효율적이지 못한 방법을 사용한 것도 많고 해서 풀이를 많이 수정했다. CodeEngn Basic RCE L20 문제 확인 이번 문제는 Cracked by: 뒤에 CodeEngn! 이 출력되려면 crackme3.key 파일 안의 데이터가 무엇이어야 하는지 구하는 문제이다. 파일을 실행시켜보면 지금은 알맞는 key파일이 없기 때문에 아래와 같이 아무런 문구도 뜨지 않는다. CodeEngn Basic RCE L20 풀이 /* 앞부분에 삽질이 좀 있어서 알맞는 풀이는 밑으로 쭉쭉 내려서 마지막 부분을 보시기 바랍니다 */ 제일 처음, 만들어진 CRACKME3.KEY 파일을 생성한 후 Read..
CodeEngn Basic RCE L19 문제 확인 이번 문제는 처음 보는 유형의 문제이다. 파일을 실행시켜 보면, 아래와 같이 창이 하나 뜨고 곧 종료된다. CodeEngn Basic RCE L19 풀이 먼저 해당 문제는 UPX 패킹이 되어있기 때문에 언팩을 해줘야 한다. UPX 언팩과 관련해선 다른 문제에서도 반복적으로 계속 다뤘으므로 여기선 패스한다. 일단, 프로그램 밀리세컨드 체크를 수행하는 함수가 어떤 것이 있는지를 먼저 알아야 한다. 구글링한 후 문제의 파일에서 임포트하고 있는 함수 중에 실제로 실행되고 있는 함수를 거르니 timeGetTime이 남았다. 호출부분을 찾으면 끝이겠거니 했는데 호출 부분이 상당히 많다. IDA로 하나하나 보면서, 비교구문 없이 그냥 끝나버리거나 혹은 코드로는 있지..
CodeEngn Basic RCE L18 문제 확인 L18 문제는 Name이 CodeEngn일 때 시리얼 값을 구하는 문제이다. 파일을 실행시켜보면, 아래와 같이 Name과 시리얼 값을 입력받고 있다. CodeEngn Basic RCE L18 풀이 L17 문제에서 삽질을 많이 한 것과는 달리 이번 문제는 상당히 쉽다. Name에 CodeEngn을 넣어주고 문자열 비교하는 부분에 bp를 걸어 정답 시리얼 값을 확인하면 된다. 이번에도 역시 문자열에서부터 시리얼 값을 체크하는 함수를 찾아주었다. 딱봐도 lpString1,2 중에 하나가 정답 시리얼 값이다. lstrcmpiA 함수 호출부분에 bp를 건 후 실행시키면 정답 시리얼 값을 확인할 수 있다. 그리고 해당 시리얼 값을 Name이 CodeEngn일 때 ..
CodeEngn Basic RCE L17 문제 확인 앞선 문제들이 Name이 주어졌을 때 시리얼이나 키값을 구하는 문제들이었다면 17번 문제는 Key값이 주어지고 이때의 Name 값이 무엇인지 묻고있다. 이번 문제는 Name이 한자리인 것에서도 삽질을 좀 하고 4바이트를 넘어가는 연산이라는 것을 생각하지 못해서도 삽질을 하고... 삽질을 좀 많이 했다. 파일을 실행시켜 보니 아래와 같이 Name과 Key 값을 입력받고 있다. CodeEngn Basic RCE L17 풀이 문자열에서 Key를 체크하는 함수에서 사용될 것 같은 'Good Boy!!!'와 'Well done!'을 발견하고 사용되는 함수로 가보았다. 해당 문자열이 쓰인 부분 위의 베이직 블락을 보니 LstrCmp 함수 호출로 두 문자열을 비교하..
CodeEngn Basic RCE L16 문제 확인 CodeEngn Basic RCE L16 문제는 L14, L15 문제와 동일하게 Name이 CodeEngn일 때의 시리얼 값(여기서는 password 값)을 찾는 문제이다. 파일을 실행시켜보니, 아래와 같이 Name과 Password 값을 받고 있다. CodeEngn Basic RCE L16 풀이 CodeEngn Basic 문제들은 대부분 string에서 관련 문자열을 찾으면 대부분 정답에 근접해질 수 있게끔 구성이 되어있다. 이번에도 역시 Password 체크 분기문에 접근할 수 있는 'Godd Job'이라는 문자열을 사용하는 함수를 찾는 것에서부터 문제 풀이를 시작한다. 해당 문자열이 사용된 함수로 가보니, 아래와 같이 password를 체크하는 분..
CodeEngn Basic RCE L15 문제 확인 L14 문제와 동일하게 Name이 CodeEngn일 때 시리얼 값을 구하는 문제인데 이번 풀이는 상당히 짧다. 파일을 실행시켜 보니, 아래와 같이 Name과 Serial 값을 받고 있다. CodeEngn Basic RCE L15 풀이 PEID로 간단히 확인해보니 패킹되어 있는 것은 없고 델파이 프로그램이다. 델파이 분석 툴이 필요할까 했는데 없어도 풀이는 충분히 가능했다. 먼저 문자열 값 중에 시리얼 체크 분기와 관련있어 보이는 문자열인 'You cracked the ~'을 찾은 후 해당 문자열이 쓰이는 함수로 가 시리얼 체크 분기문을 찾을 수 있었다. 분기 조건이 eax와 dword_45B844가 같은지 이므로 해당 부분에 bp를 걸고 eax와 45B..
CodeEngn Basic RCE L14 문제 확인 Name이 CodeEngn일 때의 시리얼 값을 구하는 문제인 것을 보니 Name에 따라서 시리얼 값이 달라지는 모양이다. 파일을 실행시켜보니 아래와 같이 두개의 입력값을 받게 되어있고 첫번째 입력값이 Name인 것으로 추정된다. 참고로 해당 파일은 UPX 패킹이 되어있기 때문에 언팩을 해주어야 한다. CodeEngn 문제 파일 중에 UPX로 패킹되어있던 파일이 많아 여러번 언팩을 했으므로 언팩과 관련해서는 아래의 포스팅 등을 참고하길 바란다. 관련포스팅 [CodeEngn] Basic RCE L05 풀이 (UPX 패킹) [CodeEngn] Basic RCE L06 풀이 CodeEngn Basic RCE L14 풀이 임포트하는 함수중에 GetDigItemT..
CodeEngn Basic RCE L13 문제 확인 문제가 참 심플하다. 파일을 실행시켜 보니, password를 입력하게 되어있다. 이 password를 구하면 되는 문제인 것 같다. IDA로 열어봤는데 좀 이상해서 확인해보니 닷넷 프로그램이다. 닷넷 프로그램은 닷넷 디컴파일러로 확인을 해야 제대로 볼 수 있다. 닷넷 디컴파일러 중에 dotPeek이라는 무료 프로그램이 있다. 아래 링크에서 다운받을 수 있다. dotPeek, 무료 닷넷 디컴파일 툴 dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains dotPeek is a free tool based on ReSharper. It can reliably decompile any .NET asse..
CodeEngn Basic RCE L11 풀이 패킹된 파일의 OEP와 Stolenbyte를 찾는 문제로 Basic RCE L09 문제와 거의 동일한 문제이다. Stolenbyte에 대한 설명은 [CodeEngn] Basic RCE L09 풀이 (StolenByte) 를 참고하기 바란다. CodeEngn Basic RCE L12 풀이 UPX로 패킹된 해당 파일의 EP는 pushad로 시작하고 있다. pushad 명령을 사용하면 현재의 레지스터 상태가 스택에 저장되게 된다. 그리고 OEP로 점프하기 직전에 저장한 레지스터를 복원할 것이기 때문에 레지스터값이 저장된 스택에 하드웨어 bp를 걸어주었다. 그럼 다음과 같이 popad로 스택에 저장되어 있던 레지스터 값을 다시 복원하는 부분에서 bp가 걸리게 된다...
CodeEngn Basic RCE L10 문제 확인 이전에 간간히 있었던 문제와 동일한 성향의 문제이다. 언팩을 통해 OEP를 구해야 하고 추가적으로 등록 성공 지점으로 가는 분기점의 옵코드를 구해야 한다. 파일을 실행시켜보니 아래와 같이 Name, Serial을 입력받게 되어있다. 여태까지 UPX 패킹만 나왔는데 이번엔 ASPack이 나왔다. 하지만 UPX이던 ASPack이던 간단한 패커이기 때문에 레지스터 백업과 복원의 위치에서 OEP로 뛰는 부분만 잘 찾아주면 된다. CodeEngn Basic RCE L10 분석 pushad로 처음엔 레지스터 상태를 백업하고 있다. 그다음 popad에 bp를 걸여주려 했는데 한개가 아니라서.. 스택에 하드웨어 bp를 걸기로 했다. pushad를 실행시키고 나서 스택..
CodeEngn Basic RCE L09 문제 분석 이번 문제는 StolenByte를 구하는 문제이다. StolenByte는 이 문제에서 처음 들어봐서 구글링해보니, 일종의 안티디버깅 기법이라고 한다. 의미 그대로 일부 코드 조각을 훔쳐서 다른 부분으로 옮긴 것인데 주로 OEP 주소의 코드를 따로 분리해서 OEP로 점프하기 직전에 push로 넘겨준다고 한다. 따라서 OEP를 찾아서 덤프를 떠서 언팩했다고 생각하고 실행하려고 하면 실행이 되지 않는 것이다. OEP의 옵코드 몇바이트가 JMP 직전에 있었기 때문에 OEP로 코드 조각이 오지 못했고, 예를 들어 함수의 인자값에 대한 push 옵코드였다면 함수의 인자가 충분하지 않으므로 실행에서 에러가 나게 되는 것이다. 이런 경우 소위 SolenByte라고 하..
CodeEngn Basic RCE L08 문제 확인 여태까지 나왔던 문제들과 비슷한 맥락으로 OEP를 구하는 문제이다. 일단, 실행시켜 보니 계산기 프로그램이다. 해당 문제는 아래 두 문제와 거의 유사하다. [CodeEngn] Basic RCE L05 풀이 [CodeEngn] Basic RCE L06 풀이 CodeEngn Basic RCE L08 풀이 UPX에서 OEP를 수동으로 언팩하는 방법은 위 포스팅에서 두번 설명했으므로 여기서는 패스하도록 하겠다. popad를 찾은 후 밑에 jmp 부분을 찾아 점프하면 OEP를 찾을 수 있다. 아래 부분이 OEP인 것으로 확인된다.