7월, 2019의 게시물 표시

파일 릴리즈 배포와 디지털 서명 cert

파일을 배포하기 위해 릴리즈로 컴파일 하더라도 디지털 서명이 되어있지 않은 프로그램들은 보안성을 위해 chrome나 윈도우 smart screen 보안으로 인해 실행하기 번거롭거나 다운로드 받아 사용할 수가 없다. cert라는 프로그램을 사용해 키를 생성해 사설 인증서로 인증받게 되는 과정을 인터넷 검색으로 찾은 내용을 적어본다. 참고 블로그 주소 cert.zip 압축을 푼 뒤 makecert.exe -n "CN=서명이름" -r -sv 서명키이름.pvk 인증서이름.cer 암호는 입력하지 않아도 무관 certmgr.exe -add 인증서이름.cer -s -r localMachine root 개인 로컬 인증서 도구에 사설 인증서를 신뢰할 수 있는 인증서라고 올리는 작업 signtool.exe signwizard 서명 옵션 : 사용자 지정 서명 인증서 : 파일에서 선택 - x.509 인증서 필터 - 인증서이름.cer 선택 개인 키 : 찾아보기 - 서명키이름.pvk 선택 해시 알고리즘 : sha1 .. 까지 진행 시 사설 인증서 디지털 서명 가능

인스톨러 제작

이미지
visual studio installer package를 따로 받아 설치하면 새 프로젝트로 인스톨러를 만들 수 있는 프로젝트 목록이 나타난다. Visual Studio Installer Projects 빠른 설치파일 :  InstallerProjects.vsix 이 프로젝트를 이용하여 이전에 만들었던 리버싱을 위한 프로그램을 개발했던 것들을 한 번에 설치하는 프로그램을 제작하였다. 각 프로젝트의 셋업 프로젝트를 제작하여도 되지만 셋업 위자드 프로젝트로 간단히 제작해도 된다. 프로젝트를 생성 시 직접 위자드가 나와서 파일을 add 하면 기본적으로 설치를 원하는 프로그램을 담고 있는 인스톨러를 제작하게 된다. 그 후에 프로젝트가 열리는데, Application Folder안에 설치파일이 담기게 된다. User's Desktop에 바로가기를 제작할 수도 있고, User's Programs Menu 안에 바로가기를 제작할 수도 있다. 각 파일에 대한 바로가기를 만들어 User's Programs Menu 안에 넣어보았다. 속성 뷰에서 icon과 이름을 바꿀 수 있다. 각 프로그램을 실행할 때 필요한 구성 요소가 있을 때, 각 구성요소의 자동 설치 프로그램 만들기 유무이다. 특별한 설치가 필요하지 않을 땐 체크를 풀어 실행파일 한 개만 제작하게 하면 된다. 모든 제작과 설정이 끝났으면 릴리즈 빌드를 하면 설치파일이 제작되게 된다. Reversing Package installer.msi

리버싱용 프로그램 개발 - ProcessMem Tape

이미지
프로세스 메모리에 write할 수 있는 프로그램을 제작하였다. 현재 실행 중인 프로세스의 pid를 적고 OpenProcess 버튼을 누르면 OpenProcess 함수 결과에 따라 나머지 에딧폼이 열리게 된다. hex나 char형으로 적고 싶은 대로 적게 되면 아래에 쓰기 될 내용이 이어져 나오게 된다. 원하는 대로 적은 후, TAPING 버튼을 누르면 쓰게 된다. 쓰기 결과에 따라 메시지 박스가 나온다. CLEAR 버튼을 누르면 쓰기 될 바이트가 초기화된다. -파일- ProcessMem Tape.exe

crackmes.one crackme 001 by disip 풀이 + 크래킹 프로그램 제작

이미지
crackmes.one 에서 very easy 난이도의 크랙미 중 하나를 풀어보았다. by disip 로 되어있는 크랙미인데 시리얼미이다. readme에 의하면 자기가 만든 첫 크랙미라고 하고 난이도는 10점주자면 0점이라고 할 정도로 쉽다고 한다. NAME과 PASS를 입력하고 Register 버튼을 눌러 PASS를 맞추는 프로그램이다. 디버거로 열어서 DlgItemTextA 함수를 호출하는 곳을 찾았다. 총 두 번 호출 후 문자열의 길이를 비교해서 3보다 크면 함수를 호출한다. 함수는 루틴을 거쳐가며 시리얼을 반복을 통해 검사하는 것을 볼 수 있다. 루틴을 통해 NAME의 값을 시리얼로 통째로 어느 공간에 저장하는 것이 아닌 반복문에서 시리얼을 제작해 가면서 PASS 문자열과 계속 검사를 하게 된다. 간단히 간추려서 시리얼을 푸는 코드를 짜 보았다. 1. 문자열의 길이만큼 반복 2. 시리얼 값이 되는 데이터를 레지스터로 사용(코드에는 해당되지 않음) 3. NAME 문자를 하나하나 비교해 'Z', 'z', '9' 일 경우 -1 4. NAME 문자 하나하나 + 1을 시리얼의 각 문자로 사용 5. NAME 문자 뒤에 'a' + i 의 문자를 삽입 6. 반복 예시로 NAME이 1234라면 '1' + 1, 'a' + 0, 'b' + 1, 'a' + 1, 'c' + 1, 'a' + 2, 'd' + 1, 'a' + 3 = 2a3b4c5d 라는 시리얼 값이 되게 된다. 어셈블리어를 다시 보게 되면 eax를 반복문의 조건값 / (5)번 절차의 i로 사용하고, bx와 cx를 비교하게 된다. bl에 NAME[i]번째의 값 + 1이, bh에 'a' + i의 값이 들어가고 cx에 문자열의 위치 + eax * 2의

리버싱용 프로그램 개발 - PE Backpack, R2R, Strview

이미지
리버싱을 공부할 때 중요한 PE Header Format 공부를 하던 중 책에서 찝어준 중요한 구조체 요소들만 가지고 PE Viewer를 제작하였다. c언어의 파일 입출력을 가지고 제작하였고 사실상 노가다에 다름없는..코딩이었다. 콘솔 어플리케이션으로 만들었고, 이걸 바탕으로 mfc를 이용해 제작을 하였다. 리버싱 핵심원리 책에서 PE Header Format 시작에서 또 하나 중요한 것으로 Rva <-> Raw계산을 꼽았다. 이것도 콘솔 어플리케이션으로 한 번 만들어 보고 그것을 바탕으로 mfc를 이용해 윈도우 어플리케이션으로 한 번 더 만들었다. 그리고 잘 사용할 수 있을지는 모르겠지만 파일의 모든 문자열을 파일 옵셋과 함께 출력하는 프로그램도 같이 만들었다. 현재 이 프로그램은 콘솔로만 제작이 되어있다. --다운로드-- PE Backpack.exe R2R.exe Strview.exe

crackmes.one 크랙미 3개 풀이

이미지
최근에 알게 된 사이트로 crackmes.one라는 사이트에 리버싱을 위한 크랙미가 많이 있다. very easy 난이도를 가진 것부터 시작했다. 여기 있는 모든 문제의 난이도는 very easy였던 걸로 기억한다. 이전에 작성된 풀이보다 좀 짧고 생략된 설명이 있을 수 있다. 1. crackme1.EXE 압축을 푼 폴더의 이름을 바꿔둬서 원 작성자가 기억이 나지 않는다. 비밀번호를 입력해 맞추는 형식이다. 크랙미 모듈로 들어가면 바로 보인다. 입력한 결과와 아래의 루틴을 통해 연산한 값으로 비교를 통해 틀림과 맞음을 구별. 연산은 문자열 각 한개씩을 비교해 가며 문자와 문자를 비교해 같거나 크거나 작음을 보고 edx를 가산/감산한다. 연산을 정리해서 key를 구하는 코딩을 하였다. -1, 1이 아니더라도 크거나 작기만 하면 된다. 클리어. 2. CrackMe#1-InfoSecInstitute-dotNET-Reversing.exe 파일 이름에서도 알 수 있듯이 닷넷 문제이다. 닷넷 문제는 리플렉터 등의 툴을 이용하면 쉽게 접근할 수 있다. 나의 경우에는 dnspy로 풀었다. dnspy로 열어서 찾다보면 form1에서 빠르게 찾을 수 있다. 클리어. 3. oldsofts_keygenme_2.exe 키젠미다. 참고로 64비트 프로그램이다. 모듈을 옮긴 뒤 문자열을 찾으면 이름과 시리얼을 넣는 곳이 나온다. bp를 건 곳에서 이름을 시리얼로 바꾸는 실행을 하는 곳으로 간다. 반복문의 루틴 줄 수는 적은데 64 버전 디버깅을 하는 것은 처음이라 굉장히 어려웠다. 루틴을 실행-트레이싱-반복을 통해 해석해 보면서 풀었다. 이 루틴이 있고, 그 뒤에 루틴으로 만들어진 결과의 값들을 또 연산을 하고, sprintf로 특정 주소에 %d-%d의 형태로 쓰는 것을 볼 수 있다. 해석한 루틴을 바탕으로 key를 구하는 코딩을 하였다. 중요 연산은 1.

레나 리버싱 Tut.ReverseMe1 풀이 2

이미지
이전에 Nag 메시지창을 띄우지 않게 하는 것까지 해 보았다. 다음은 Register me!버튼을 클리어 하는 과정을 따라가 보자. 1234를 입력하고 Register me!버튼을 누르면 당연하게도 틀렸다고 나온다. Nag버튼의 문제를 해결하기 위해 했던 방법을 생각해보자. Nag버튼을 눌렀을 때 Nag 메시지 버튼이 새로 나왔었다. 이번의 Register me!버튼도 틀렸을 때 틀렸다는 메시지 창이 나오게 된다. 그렇다면 틀렸을 때 이전과 같은 rtcMsgBox함수를 호출할 것이다. Nag를 해결할 때 rtcMsgBox함수가 있는 곳을 찾아 모든 곳에 bp를 걸었으면 1234를 입력 후 Register me! 버튼을 눌렀을 때 bp에서 멈추게 될 것이다. rtcMsgBox함수를 호출하는 곳인 bp에서 멈추게 되었다. 메시지 박스를 띄운다는 것은 이미 틀렸다는것이 검증이 되어 있다는 것일수도 있다. 위를 올려서 전체적인 흐름을 잡아보자. 위를 좀 올려다 보니 틀렸을 때 나오는 메시지창에서의 텍스트가 있는 것, 비교를 통한 점프문이 있는 것을 볼 수 있다. 저 비교-점프문이 문자열이 registration code인지 검사하는 것인지는 아직 모르지만, 단순히 점프문을 패치시키는 것 만으로 해결하지 말고 위를 더 살펴보자. 위를 올려보니 vbaStrCmp함수에 00401DDC의 문자열, ebp - 58의 문자열을 인자로 넣고 함수를 호출하는 것을 볼 수 있다. vbaStrCmp함수는 함수의 이름대로 문자열 두 개를 비교하는 함수인 듯 하다. 00401DDC에 있는 문자열이 registration code일 것 같다. ebp - 18의 문자열을 인자로 넣는 곳에 bp를 걸고 다시 버튼을 눌러 보았다. 예상한 대로 내가 입력한 1234가 인자로 들어가는 것을 볼 수 있다. 그럼 registration code로 예상되는 I'mlena151 을 넣고 다시 버튼을 눌러보자 맞다