리버스 엔지니어링 27

리버싱kr easy_Keygen 풀이 2

이전까지 이름을 넣었을 때 이름을 넣은 것을 어떤 루틴을 통해 시리얼 값으로 변해 메모리에 저장되고, 그 값과 시리얼을 정확히 맞추면 풀린다는 것을 깨달았다. 게싱과 실험이 난무한 풀이였지만 일단 작성해 보도록 하겠다. 이름에 1234를 넣었을 때의 시리얼 값은 21120324였다. 어떠한 규칙이 있을 지 일단 이름을 1111을 넣고 다시 실행시켜 보자. 시리얼까지 입력받고 난 뒤의 실행문이다. 시리얼이 저장되는 위치는 따로 바뀌지 않았으며, esp + 74의 위치를 덤프창을 통해 본 결과 0019FE7C 32 31 31 31 30 31 32 31 00 00 00 00 00 00 00 00 21110121........ 시리얼 값은 "21110121"인 것을 볼 수 있다. 아직 어떠한 규칙인지 잘 모르겠..

리버싱kr easy_Keygen 풀이 1

reversing.kr 두 번째 문제로 이지키젠을 풀어보았다. 이전에 이지크랙미보다 훨씬 분석을 덜 하고 게싱으로 푼 게 조금 아쉽다면 아쉽다. 실행 시 이름과 시리얼을 받아 맞음이나 틀림을 띄워준다. 그리고 reversing.kr 풀이에 필요한 auth 키는 제공된 텍스트 파일의 예시 시리얼일 때의 이름을 찾는게 auth 키를 찾는 것이다. x64dbg로 열어보자. easy keygen모듈을 들어가니 바로 눈에 띄게 사용자 코드가 보인다. 일단 이름을 1234를 넣고 bp를 걸어서 잠깐 보기로 했다. 함수를 호출하고 난 뒤 스택창의 "1234"가 들어가있는 주소를 덤프창에서 확인해 보니 잘 들어가있다. 문자열들은 esp + 18의 주소의 위치에 상주해 있는 것을 다음 실행문 확인 테이블?에서 볼 수 있..

리버싱kr easy_crackme풀이 3

이전에 두 번째 루틴까지 풀었다. 풀은 루틴까지 적용시켜 빠르게 디버깅 해 보기 위해 이전 루틴들을 맞춘 상태로 실행시켰다. 이전 루틴 다음줄까지 다른 수정 없이 바로 진행되는 것을 볼 수 있다. 다시 시작해보자. 따로 함수 호출을 하진 않지만 많은 연산을 거치며 마지막에 test연산을 통해 루틴 검사를 하는 것을 볼 수 있다. esi와 ebx의 레지스터를 온전히 사용하기 위해 스택에 push해 백업하고, esi에 "R3versing"이라는 문자열을 복사한다. push를 2번 하여 스택 포인터, 즉 esp가 가리키는 위치는 두 번 증가하였고, esp + 10의 위치는 입력한 문자열의 5번째 위치, 숫자 '1'의 위치이다. 문자열이 있는 주소를 eax에 복사하여 넣어준다. 그 후 dl과 bl에 각각 eax..

리버싱kr easy_crackme풀이 2

편의상 ButtonListner라는 레이블을 붙여보자. 주요 내용을 훑어보자. 함수 프롤로그는 대충 보고 GetDigItemTextA라는 함수를 호출하는 것이 보인다. 텍스트박스의 텍스트를 가져오는 함수인 것 같다. https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getdlgitemtexta#parameters 대화 상자의 핸들러, 컨트롤러의 아이디?, 문자열을 입력받을 버퍼 위치, 버퍼의 크기 순 인자인것 같다. 스택에 들어가는 순으로 보면 eax가 가장 마지막 인자이고, 인자가 총 3개 들어가는 것을 보니 getDigItemTextA의 상위 함수 중 문자열 길이를 받지 않는 3개의 인자를 받는 함수를 사용한 듯 싶고, e..

리버싱kr easy_crackme 풀이 1

두어 번 풀었던 거지만 reversing.kr 아이디를 까먹어서 다시 만들고 블로그에 작성하는 김에 다시 풀어본다. 가장 첫 번째 문제인 easy crackme를 실행시켜 보았다. 텍스트를 칠 수 있는 공간과 확인 버튼이 있다. 123을 치고 확인을 눌러보면 이렇게 틀렸다고 나온다. 비밀번호를 맞춰야 한다. 이번엔 디버깅 등을 올리디버거가 아닌 x64dbg를 사용해 보려 한다. x64dbg에도 익숙해져야 하기 때문에. 실행 시킨 x64dbg를 attach해서 바로 창을 띄웠다. 상단 바에 모듈이 ntdll.dll로 되어 있는데, 보기-Modules에서 easy_crackme.exe모듈로 바꿨다. 여기서 시작부분 근처에 바로 DialogBoxParamA함수를 호출하는 것을 볼 수 있다. DialogBoxP..

리버싱 연습 - Lenas reversing 1 클리어 과정

Lenas reversing for newbies 라는 Tuts 4 You 홈페이지에서 Lena 라는 분이 올렸던 크랙미 파일들 중 첫번째에 해당하는 크랙미를 풀어보려고 한다. 실행시키자 마자 저런 메시지창을 띄우고 확인을 누르면 프로그램이 종료된다. 뭐지 싶었다. 올디로 열어보기로 했다. 아 그전에 어떤 언어로 이루어졌는지 ExeinfoPe로 한번만 살펴보겠다. 그냥 어셈블리어로만 작성되어 있는 것 같다. 올리디버거로 켜보았다. 첫 페이지부터 아까의 메시지창을 띄우는 함수호출 부분이 보일 정도로 가깝다. 아이콘을 로드하고, 커서를 로딩하는 함수를 사용하고, 그 다음에 CreateFileA라는 함수를 사용하는데, 이 함수는 winAPI에서 제공하는 함수인 것 같다. 함수를 호출하기 위해 집어넣는 파라메터..

리버싱 연습 - abex crackme5 시리얼 타파

abex crackme5를 풀어보려고 한다. 시리얼을 입력해서 확인하는 메시지박스가 뜨는 간단한 프로그램이다. 아무거나 입력했더니 아니라고 한다. 올리디버거로 따라가 보려고 한다. 윈도우 메시지폼이 뜨는 것으로 보아서 vc등으로 개발 된 것 같기도 하다. 어셈으로만 이루어진 것 같다. 윈도우 메시지폼이 뜨고, Check 버튼이 있는 것을 보아 버튼이 눌렸을 때 무언가를 해 주는 이벤트 핸들러 함수에 검사하는 내용이 있을 것이라고 추측 할 수 있다. 올리에서 find all strings를 통해 틀렸을 때의 메시지와 맞았을 때의 메시지를 push하는 주소를 찾을 수 있었다. 따라가면 바로 위에 점프 분기문이 보이고, strcmp함수를 호출한 것으로 보아 텍스트창에 있는 문자열과 어떤 문자열을 비교해서 점프..

리버싱 연습 - abex crackme2 (3) 시리얼 핵심 루틴

abex crackme2를 풀 수 있는 방법은 정해져 있지 않다. 시리얼을 알아낼 수 있는 방법 정도로 풀 때, 비교할 시리얼이 어떻게 만들어지는지 핵심 루틴이 궁금했다. 시리얼이 어떻게 만들어지는지는 조금 분석 따라가기가 버겁다. 리버싱 핵심원리에서 읽었고, 읽어본 대로 책을 이후에 보지 않고 따라가 보았다. 버튼 이벤트 리스너 함수에서 내리다보면 Name 필드에 입력한 값을 복사하는 명령어가 있다. 그 아래에도 Name 필드의 값을 복사하고 VbaVarMove 함수를 호출한다. 아래에 자주 호출되는 VbaVarMove 함수는 무슨 내용인지 자세히 모르겠다. 조금 더 디버깅하면 VbaLenVar 이라는 함수가 나오는데 함수 호출 전에 4를 Local.53에 복사하는 것을 볼 수 있다. VbaLenVar..

리버싱 연습 - abex crackme2 (2)

abex crackme2를 풀어내는 방법중에 분기문이 있는 곳에 점프문을 수정해서 풀어 보았다. 다른 방법으로도 풀어내 보자. 틀렸을 때 나오는 메시지의 문자열을 바꾸는 방법 문자열 패치 문자열 수정하기도 귀찮아서 맞았을 때 나오는 문자열의 주소를 넣게 하였다. 그 다음 방법은 정석적인 이름에 따른 시리얼 값이 있는 주소에서 시리얼 값을 알아와서 맞게 입력해서 패치 없이 진행하기 테스트는 아래와 같이 하였다. 분기문이 있는 곳 위에 함수가 있는데 아마 이 함수에서 비교를 하는 것 같다. 함수 안에 들어갔을 때 local.17과 local.13의 주솟값을 매개변수로 넣은 arg.2와 arg.1의 주솟값을 또 push 하고 있는데 그 스택에 있는 주소를 아래 hex 덤프 창에서 보니 0019f18c 와 00..

리버싱 연습 - abex crackme 2 (1)

리버싱 핵심원리 책을 읽으면서 실습했다. 크랙미란, 리버싱 연습을 위해 일부러 디버깅/리버싱으로 프로그램을 고의로 수정해서 문제를 풀어나가게 하는 프로그램들인데 유명한 입문? 크랙미 프로그램인 abex crackme 2를 리버싱 실습을 하려고 한다. abex2는 실행 시 이렇게 이름과 시리얼을 적는 곳과, Chcek, About, Quit 버튼이 세 개 있고 이름과 시리얼을 적고 check 버튼을 눌러서 이름에 대한 시리얼이 맞는 지 비교해 적절한 출력을 내 주는 프로그램이다. 이름에 1234를 적고 시리얼에 hello를 적어서 check 버튼을 눌렀더니 아니라고 뜬다. 그리고 이름이 4글자 미만이면 이름을 4글자 이상 적으라고 나온다. 이름은 최소 4글자는 적어야 한다. 올리디버거로 열어보았다. 이전에..