문제의 의도대로 정확하게 분석해서 푼듯한 느낌은 안들지만 rsrc 섹션 데이터를 확인하는 순간 풀 수 있는 문제이다. 봐야겠다는 생각을 늦게하긴 했지만... reversing.kr ImagePrc 풀이 ImagePrc.exe 를 실행시킨 후 Check를 누르면 틀렸다는 메시지창에 나온다. Wrong 문자열이 사용되는 함수로 먼저 가보자. Wrong 창이 출력되는 블록을 보면 딱 한가지 경로밖에 없는데 처음 함수 시작에서 빨간네모박스 분기를 타는 것이다. 처음 분기에서 왼쪽 분기를 타게 되면 무조건 Wrong 출력되는 곳으로 가기 때문에 파란색 분기를 대안으로 생각할 수 있다. 제일 정답에 가까워보이는 분기는 왼쪽 파란색 네모 분기를 타는 것인데 그럴려면 ecx가 0x1이어야 한다. 그래서 ecx가 무조건..
정형화된 유형의 키젠만 풀어봤기 때문에 뇌정지가 왔던 문제이다. reversing.kr Replace 풀이 Replace.exe는 입력값을 받아서 check하는 심플한 프로그램이다. 언제나 그렇듯, 먼저 체크 루틴에서 사용되는 문자열이 사용되는 함수로 가보았다. 이번 문제는 특이한게, Correct로 가는 분기가 아예 없다. 정답값 인증이 입력값인 경우밖에 생각할 수 없으므로 입력한 입력값을 알맞게 주면 그게 ~~~ 되어 뭔가 Correct 분기를 탈 수 있게 만들어야 하는 문제인 것 같다. 함수가 별로 크지 않으므로 트레이싱 하면서 봐보자. 참고로 이번 파일은 IDA가 틀리게 디컴파일한 부분이 많아서 동적으로만 보려고 한다. 입력값을 123(0x7B)으로 주고 입력값을 입력받아서 eax에 저장하는 Ge..
우회 자체는 어렵지 않은데 런타임 에러 때문에 삽질을 많이 했던 문제이다. reversing.kr Music Player 풀이 이번 문제는 1분듣기 밖에 안되는 파일의 1분 체크 루틴을 우회해서 1분 이상 실행시키는 문제이다. 1분 이상 실행되면 플래그가 출력된다고 한다. mp3 파일을 넣어보면 1분 듣기 후 아래와 같이 "1분 미리듣기만 가능합니다.'라는 메시지 창이 출력된다. 이번 파일은 비주얼 베이직 (VB) 프로그램이기 때문에 IDA로 디컴파일이 안된다ㅠㅠ 일단 메시지창 함수가 실행된다는 것을 알기 때문에 관련 함수 호출부분을 찾기로 했다. 다행히도 msvbvm60.dll 함수 중 "msg"가 들어간 함수는 rtcMsgBox밖에 없었다. 해당 함수에 bp를 걸고 리턴주소가 저장되는 스택 상단을 보..
[reversing.kr] Easy Unpack 풀이 이번 문제는 실행파일의 OEP를 찾는 문제로 시작은 GetProcAddress 함수 호출로 이루어져 있다. 원래 실시간 바이러스 겁사를 계속 꺼주었다 켜주었다 하는게 귀찮아서 Windows7 가상머신에서 문제를 푸는 편인데 이번 파일은 윈7에서 실행시키니 자꾸 GetProcAddress에서 함수를 못찾고 0을 리턴해서 윈10에서 풀기로 했다. 보통 OEP를 찾기 위한 방법으로 pushad&popad(OEP로 점프하기 전에 처음 레지스터 상태를 스택에 보원해놓고 백업하기 위함)를 찾고 popad 밑에있는 jmp문을 확인하는 방식이 있는데 너무 많다. 많은건 둘째치고 앞에 몇개정도 테스트해봤는데 정상적인 popad 코드가 아니거나 실행 루틴에 포함이 안되..
간단한 IDA 사용법이라고 할지... 개인적으로 분석할 때 알고있으면 유용하다고 생각하는 팁들을 정리해보려 한다. (+ 아직 몇가지 밖에 없는데 생각날 때마다 계속 추가될 예정이다) 함수 관련 함수 설정 (Create Function) 가끔 함수 시작지점이 맞는데 함수 지정이 안되어 있어서 함수로 인식이 안되는 경우가 있다. 이럴 경우 프롤로그 시작부분에 커서를 놓고 마우스 우클릭을 하면 'Create function'이 있는데 이걸 클릭해주면 된다. 이전 분기 찾기 아래와 같이 분기가 상당히 복잡한데 예를들어 원하는 블록의 이전 블록을 찾고싶다면 복잡한 화살표를 일일이 눈으로 따라서 찾아가지 않고도 화살표를 두번 클릭하면 자동으로 이전 블록이 찾아진다. 코드 관련 옵코드 보기 옵코드를 같이 보고 싶다면..
reversing.kr Easy Keygen 풀이 "Easy Keygen.exe"를 실행시키면 아래와 같이 Name을 입력받고 Serial 값도 입력받는다. 그리고 이번 문제에는 README에 문제가 아예 설명되어 있는데 "Find the Name when the Serial is 5B134977135E7D13" 이다. Name을 사용해서 시리얼값을 생성하는데 역으로 시리얼 값을 주고 맞는 Name을 찾아내는 문제이다. 코드 작성이 필수일 것 같다. 먼저 IDA에서 "Correct!"와 같이 시리얼 생성 함수에서 사용될 것 같은 문자열을 찾은 후 해당 문자열을 호출하는 함수로 가보았다. 이런 시리얼 생성 알고리즘과 관련한 문제는 먼저 헥스레이로 전체적인 구조?를 파악한 후 세부 알고리즘은 어셈으로 하나하..
2017년에 풀기 시작한 reversing.kr 문제들을 여기로 옮기려 하는데, 풀이가 엉망인게 많아서 결국 다시 풀게됐다. 옛날에 Position까지 풀고나서 연구실 일을 하느라 바빠서 풀지 못했는데 Position까지 다 옮기고 나면 간간히 한문제씩 풀어보려고 한다. reversing.kr은 리버싱 워게임 중에서도 난이도가 있는 편에 속하고 심지어 문제도 따로 없이 바이너리만 주어지는 경우도 있기 때문에 문제 의도가 뭔지 알기 힘든 것도 많다. 그래서 소제목도 좀 통일성이 없고 양식을 통일하기도 힘들 것 같아서 크게 신경쓰지 않고 줄글 느낌으로 쓰기로 했다. reversing.kr Easy Crack 풀이 먼저 Easy Crack 파일을 실행시켜 보면, 아래와 같이 어떤 값을 입력받고 있다. 정답 시..
드디어 코드엔진 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를 체크하는 분..