2월, 2019의 게시물 표시

java 연습
은행 시스템 만들어보기

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

리버싱 연습
lenas reversing 1
클리어 과정

이미지
Lenas reversing for newbies 라는 Tuts 4 You 홈페이지에서 Lena 라는 분이 올렸던 크랙미 파일들 중 첫번째에 해당하는 크랙미를 풀어보려고 한다. 실행시키자 마자 저런 메시지창을 띄우고 확인을 누르면 프로그램이 종료된다. 뭐지 싶었다. 올디로 열어보기로 했다. 아 그전에 어떤 언어로 이루어졌는지 ExeinfoPe로 한번만 살펴보겠다. 그냥 어셈블리어로만 작성되어 있는 것 같다. 올리디버거로 켜보았다. 첫 페이지부터 아까의 메시지창을 띄우는 함수호출 부분이 보일 정도로 가깝다. 아이콘을 로드하고, 커서를 로딩하는 함수를 사용하고, 그 다음에 CreateFileA 라는 함수를 사용하는데, 이 함수는 winAPI에서 제공하는 함수인 것 같다. 함수를 호출하기 위해 집어넣는 파라메터들이 많은데, < lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile > 이렇게 파라메터가 이루어져있다. 스택에 집어넣을 때 반대로 집어넣는 것을 유의하여 확인해보면 "Keyfile.dat", C0000000, 3, 0, 3, 0040216f에 있는 값, 0 를 스택에 넣는 모습이다. 일단 0040216f에 있는 값까지 알아보자. push 하는 곳까지 실행시킨 뒤 0040216f을 덤프창에서 찾아보니 80 00 00 00이 나온다. 리틀엔디언을 빅 엔디언으로 바꾸면, 00000080(0x80)이 나온다. 각 파라메터의 의미는 파일 이름, 파일에 대한 권한  GENERIC_READ ,  GENERIC_WRITE,   파일에 대한 연속적 권한(다른 프로세스의 읽기/쓰기/열기), 자식 프로세스에 관한 권한 boolean(정확히 모르겠다), 파일의 존재 여부와 그에 대한 생성/삭제 여부,

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

이미지
abex crackme5를 풀어보려고 한다. 시리얼을 입력해서 확인하는 메시지박스가 뜨는 간단한 프로그램이다. 아무거나 입력했더니 아니라고 한다. 올리디버거로 따라가 보려고 한다. 윈도우 메시지폼이 뜨는 것으로 보아서 vc등으로 개발 된 것 같기도 하다. 어셈으로만 이루어진 것 같다. 윈도우 메시지폼이 뜨고, Check 버튼이 있는 것을 보아 버튼이 눌렸을 때 무언가를 해 주는 이벤트 핸들러 함수에 검사하는 내용이 있을 것이라고 추측 할 수 있다. 올리에서 find all strings를 통해 틀렸을 때의 메시지와 맞았을 때의 메시지를 push하는 주소를 찾을 수 있었다. 따라가면 바로 위에 점프 분기문이 보이고, strcmp함수를 호출한 것으로 보아 텍스트창에 있는 문자열과 어떤 문자열을 비교해서 점프하는 것 같다. 점프만을 패치하는 것보다 본 분석에서는 실제로 맞춰야 하는 시리얼을 찾고자 함이므로 위로 올려본다. 위로 올렸을 때 함수의 프롤로그로 보이지는 않지만 시작지점이 보이고, 분기문도 보인다. 이 곳으로 점프를 뛰는 곳으로 올라갔을 때 call을 볼 수 있다. DialogBoxParam 함수를 호출하는 것으로 보아 이 위치 자체가 윈도우 메시지박스의 이벤트 핸들러 함수인 것 같다. 항상 반복해가며 호출과 switch문(또는 if문)을 거쳐가며 각 메시지에 따라서 함수를 호출하거나 아무것도 하지 않게 된다. 실제로 bp를 걸고 실행하게 되면 창을 건들기만 해도 bp에 걸리게 된다. 다시 분기문쪽으로 와서, 65랑 비교해서 점프하지 않을 땐 리턴하는 곳으로 간다. 점프했을 때, 아래에서 GetDigItemText 함수를 호출하는데, 텍스트박스에서 문자열을 가져오는 함수인 것 같다. 메시지박스의 이벤트가 65일 때(Check 버튼을 누르는 이벤트일 때) 메시지박스의 문자열을 가져오게 한다. GetDigItemT

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 {      public   static   void  main( String [] args) {          int  i  =   10000 ;          long  l  =   1000000 ;          short  s  =   100 ;          byte  bte  =   1 ;                   double  d  =   3. 14 ;          float  f  =   2. 17f;          char  c  =   '한' ;          String  str  =   "hello" ;                  boolean  b  =   true ;     } } Colored by Color Scripter cs -정수형- int short byte long -실수형- double float -문자 자료형- char S

리버싱 연습
abex crackme 2 -3
시리얼 핵심 루틴

이미지
abex crackme2를 풀 수 있는 방법은 정해져 있지 않다. 시리얼을 알아낼 수 있는 방법 정도로 풀 때, 비교할 시리얼이 어떻게 만들어지는지 핵심 루틴이 궁금했다. 시리얼이 어떻게 만들어지는지는 조금 분석 따라가기가 버겁다. 리버싱 핵심원리에서 읽었고, 읽어본 대로 책을 이후에 보지 않고 따라가 보았다. 버튼 이벤트 리스너 함수에서 내리다보면 Name 필드에 입력한 값을 복사하는 명령어가 있다. 그 아래에도 Name 필드의 값을 복사하고 VbaVarMove 함수를 호출한다. 아래에 자주 호출되는 VbaVarMove 함수는 무슨 내용인지 자세히 모르겠다. 조금 더 디버깅하면 VbaLenVar 이라는 함수가 나오는데 함수 호출 전에 4를 Local.53에 복사하는 것을 볼 수 있다. VbaLenVar은 문자열의 길이를 구하는 함수 같았다. 그대로 디버깅 해 따라가 보았다. VbaLenVar의 함수 모습 처음의 함수 프롤로그와 TlsGetValue 등의 함수를 출력하는 곳까지는 의미 없어 보인다. 사실 뭐 하는 내용인지 확실히는 모르겠다. 위의 캡처 사진에서 Eax에 있는 Name 필드의 값이 들은 주소를 스택에 한 번 더 넣고 내부에서 함수를 한 개 더 호출한다. 호출된 함수의 모습이다. 사실 잘 모른다고 했던 호출 부분들에서 이미 문자열의 길이를 구했었나보다. 유니코드로 된 문자열이 할당된 길이가 구해진? 위치는 Eax - 4였고, Eax에 그 값을 복사해 왔을 때 0xA였다. 그 다음에 오른쪽으로 1비트 쉬프트 연산으로 0x5가 되었고, 이는 유니코드의 문자열이 잡아먹는 길이가 2비트씩 되기 때문에 char 형 문자열 길이(실제 문자만의 길이)를 구하기 위해 shift 연산을 한 것 같다. abcde는 61 00 62 00 63 00 64 00 65 00으로 저장되어 있을 것이고, 차지하는 공간이 10인데 실제 문자열의 길이는 5니 1비트 쉬프트 연산을 해서 값의 1/2를