전체 글 65

레나 리버싱 Tut.ReverseMe1 풀이 2

이전에 Nag 메시지창을 띄우지 않게 하는 것까지 해 보았다. 다음은 Register me!버튼을 클리어 하는 과정을 따라가 보자. 1234를 입력하고 Register me!버튼을 누르면 당연하게도 틀렸다고 나온다. Nag버튼의 문제를 해결하기 위해 했던 방법을 생각해보자. Nag버튼을 눌렀을 때 Nag 메시지 버튼이 새로 나왔었다. 이번의 Register me!버튼도 틀렸을 때 틀렸다는 메시지 창이 나오게 된다. 그렇다면 틀렸을 때 이전과 같은 rtcMsgBox함수를 호출할 것이다. Nag를 해결할 때 rtcMsgBox함수가 있는 곳을 찾아 모든 곳에 bp를 걸었으면 1234를 입력 후 Register me! 버튼을 눌렀을 때 bp에서 멈추게 될 것이다. rtcMsgBox함수를 호출하는 곳인 bp에서 ..

레나 리버싱 Tut.ReverseMe1 풀이 1

리버싱 핵심원리(소위 나뭇잎책)에서의 레나 리버스미 문제 풀이를 책을 따라가 보며 풀어보았다. 분석은 책에서 쓰인 올리디버거를 사용하였다. Tut.ReverseMe1 문제는 처음에 Nag Screen이라는 박스가 뜨고 확인을 누르면 다음 창이 뜬다. 이게 다음 창인데, 여기서 Regcode를 맞춰서 Register me 버튼을 누르는 비밀번호 문제인 것 같다. Nag Screen 메시지창의 뜻은 모든 Nag?를 삭제(무시)시키고 올바른 registration code를 찾아라는 뜻이다. 메인 창에서도 Nag?버튼을 누르면 다시금 Nag Screen창이 뜨게 된다. 우선 책도 그렇고 문제에서 요구하는 것도 그렇고 Nag창을 없애기 위해 Nag창 부터 찾아봐야겠다. 버튼들이 있는 윈도우 폼인것을 봤을 때 버..

리버싱kr easy_unpackme 풀이

리버싱kr의 세 번째 문제인 easy_Unpackme를 풀어보려 한다. 제공된 텍스트 파일에 적힌 것을 보면 OEP(Original Entry Point)를 찾으라고 한다. exeinfope로 본 엔트리 포인트는 이상한 곳을 가리키고 있다. 실행 파일의 엔트리 포인트가 이상한 곳으로 잡혀 있고, 원래의 엔트리 포인트를 찾아 그 주소로 auth 인증을 하는 것 같다. 참고로 올리 2버전에선 올리가 알아서 oep를 찾아서 처음에 위치시키기 때문에 문제를 푸는 의미가 없어진다. 그렇기 때문에 풀이에는 x64dbg를 이용했다. 파일을 불러왔다. 모듈 ntdll.dll에서 시작하고, 전혀 모르겠는 주소로부터 시작한다. 보통 실행 파일은 내가 만든 사용자 코드로부터 바로 시작하지 않기 때문에 ntdll으로부터 실행..

리버싱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..

Java 연습 - 은행 시스템

java 연습 차원에서 프로그램을 만들어보았다. https://github.com/terria1020/Java-Practice-BankSystem java 열혈 프로그래밍 책에서 12장까지 읽은 내용을 토대로 입/출력, 클래스 생성, 생성자, 접근 제어자 등의 배운 점을 이용해서 사용했고, 시간을 불러오는 것은 책에서 스치듯 나온 것을 보고 인터넷 검색 등으로 사용해 보았다. 테스트 해 본 결과이다.

개발, 연습 2020.07.01

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

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