전체 글 65

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

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

Java 공부 - 변수의 자료형

자바의 변수의 형태와 특이점들을 정리하려고 한다. 변수의 선언은 (자료형) (변수이름); 으로 선언이 가능하다. 변수의 이름을 정하는 규칙이 있는데, - 변수 이름의 첫 번째 문자는 숫자가 올 수 없다 - 자바의 변수 이름은 대소문자를 구별한다 - '$'와 '_'이외의 특수문자는 사용할 수 없다 - 키워드는 변수의 이름으로 사용할 수 없다 - 클래스와 차이를 두기 위해 첫 글자는 소문자로 사용한다 - 되도록이면 영어 단어의 뜻이 바뀌는 위치마다 대문자를 사용한다(또는 '_') -- userName, userNameLength, player_level 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package default; public class Main { publi..

개발, 연습 2020.06.30

리버싱 연습 - 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글자는 적어야 한다. 올리디버거로 열어보았다. 이전에..

리버싱 공부 - 스택 프레임 기법

스택을 다루는데 있어서 ESP 레지스터, 현재 스택을 가리켜 주는 ESP레지스터를 사용하는데 함수를 만들고 사용할 때 함수를 들어가서 ESP 레지스터를 막 사용하다 보면 원래 돌아가야 할 위치를 알고 있더라도 함수의 시작 위치를 알 수 없게 되고 사용이 굉장히 복잡해진다. 그걸 방지?하기 위해 스택 프레임 기법이라는 방식이 도입되었다고 하는데. 함수를 들어갔을 때의 스택의 위치를 EBP레지스터, 베이직 포인터 레지스터가 가지고 있고, 함수에서 스택을 다룰 때 ESP를 사용 후 나중에 EBP에서 함수의 첫 주소를 가지고 있게 하며 안전하게 리턴할 수 있게 한다. 리버싱 핵심원리에 있는 예제와 비슷하게 코딩해봤다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2..

리버싱 공부 - 레지스터

레지스터라는 cpu에 있는 저장 공간을 이용해 데이터를 저장, 복사, 연산 등을 하는데 범용 레지스터들 EAX EBX ECX EDX AX, AL, AH BX, BL, BH CX, CL, CH CX, DL, DH 가 있고 EAX는 가장 자주 쓰게 되고 함수의 리턴 값이 EAX에 들어가기도, 함수의 인자로 사용하기도 함 ECX는 주로 반복문 등에 쓰여서 반복문의 카운터로 사용 EBX, EDX는 그냥 막 쓰이고 윈도우 API 등에서는 ECX, EDX를 자주 사용한다고 한다(나뭇잎 책에서 발췌) E(Extended)가 빠진 ~X레지스터는 16비트 레지스터 크기 ~L, ~H레지스터는 ~X 레지스터의 각각 하위, 상위 8비트로 나뉘어진 레지스터 크기 그 다음 플래그 레지스터 중 리버싱 핵심 원리에서 알아둬야 한다고..

리버싱 연습 - 점프에 관하여

리버싱 핵심원리 책을 읽으면서 레지스터에 관한 곳을 읽다가 보니 전에 리버싱 하던 게 생각났다. 반복문을 사용하는 곳에서 비교해서 점프하는 문에 관해서 의문점이 갔었는데,(잘 몰랐기 때문에) jz나 jnz처럼 비교해서 점프하는 어셈블리어는 그 앞에 cmp로 비교하는 어셈블리가 나와야 나오는 줄 알았지만 점프문 전에 연산이 있을 때 무슨 연산이건 그 연산의 결과가(레지스터) 0일 때 바뀌는 ZF(Zero Flag)값을 비교해서 jnz 명령어가 실행되는 거였다. EDI에 SUB명령어로 1을 감산한 연산이 있은 후에 JNZ에서 ZF를 검사해서 실행되고, 오른쪽에 올리디버거가 보여주는 ZF가 1일 때(EDI에 연산을 해서 EDI가 0일 때) 실행되지 않아서 그 다음줄로 넘어간다. 해석하자면 EDI의 연산 결과가..