전체 글 65

[리버싱] 메모장 시간/날짜 표시 순서 변경

메모장을 유용하게 사용 할 때가 있었다. 윈도우 기본 메모장에는 f5키를 누르면 날짜와 현재 시간을 찍어 출력해주는데, 순서가 불편했다. 오후 4:13 2020-01-24 이런 식으로, 날짜가 뒤에 나오는 것이 불편하여 호기심에 이걸 바꿔보고 싶어 리버싱을 시작했다. x32dbg로 열어, 함수 목록을 찾아보았다. f5를 눌렀을 때 시간 정보를 가져오니까 Get가 써진 함수중에 time이 붙은 함수가 있길래 bp걸고f5를 눌렀더니 멈췄다. 이 곳이 f5를 눌렀을 때의 이벤트 핸들러 함수가 있는 장소라고 생각했다. 함수를 쭉 둘러보고 몇 번 실행해 보며 관찰했다. 함수가 끝나는 부분 전에 핸들러의 edit박스를 수정하는 함수를 호출하고, 마무리짓고 끝낸다. 그리고 그 위를 보면 반복해서 뭘 호출하는데, 저 ..

[리버싱] 과연 이게 될까? Ch.1

인라인 코드 패치를 실습 후 리버싱 핵심 원리 책을 정독 중, pe header 공부를 하는 챕터에서 Dos Stub를 유심히 살펴 보았다. pe header의 스펙에 따르면, 각 섹션은 characteristics라는 엑세스 권한 비트를 가지고 있다. 그러나 pe header가 메모리에 올라갔을 때의 엑세스 권한은 알려져 있지 않은것 같은데, 디버거로 메모리 맵을 살펴보면 읽기 권한만이 부여되어 있는 것을 볼 수 있다. pe header는 프로그램을 실행할 때 pe 로더가 메모리를 정해주고, 프로그램의 스펙이 어떻게 되어 있는지 나와있는 중요한 곳이기 때문에 보호받아야 한다. 아마도 pe 로더가 pe header가 메모리에 올라갈 때 읽기 엑세스만 주어진 것으로 보인다. Dos Stub는 16비트 이하..

인라인 패치 실습 - Code Cave patch

인라인 패치 실습으로 Code Cave를 해 보도록 하겠다. abex crackme1의 MessageBoxA 함수에 인자로 들어가는 문자열을 패치시킬 것이다. 참고로 abex crackme1은 ASLR이 적용되지 않은 프로그램이다. 일단 abex crackme1을 x32dbg로 열었다. 틀렸을 때의 분기로 점프해서 넣는 인자(문자열)의 주소는 각각 402035, 402038이다. 이 주소에 각각 새로운 문자열을 써 넣어 볼 것이다. 새 문자열은 Code Cave?!와 Code Cave Patched!!이다. Code Cave를 하기 전에 이 파일의 pe 구조를 보아야 한다. 섹터가 어디부터 이루어져있는지를 봐야 하기 때문이다. Pe Backpack과 HxD로 열어서 구조를 확인 해 보았다. 코드 섹션의 ..

2019 HackCon 후기

방학 동안 하는게 없는 것 같아서 HackCon CTF를 참가하기로 했다. 온라인으로 진행되는 HackCon은 8월 22~23일 하루동안 진행되었다. (HackCon.online) 오랜만에 해 보는 CTF라 한 문제도 풀어보지 못할 것 같았고, CTF가 열리는 시간을 혼동하여 롤까지 하고 있었다. 놀듯이 해 봤던 것 같다. 결국 풀기를 성공한 문제는 스테가노그래피 100점이 부여된 첫 번째 문제뿐이었다. 이것도 예전에 비슷한 흐름을 본 적이 있어서 그 감으로 풀었던 것 같다. 사진을 열어보면 THIS_IS_NOT_A_FLAG라고 나온다. 플래그가 아니라고 하거니와 실제로 입력했을 때 플래그가 아니다. 스테가노그래피는 사진 등의 파일에 글자(암호)나 사진 등의 데이터를 숨기는 기법이라고 하며, 저 jpg파..

개발, 연습 2020.07.01

파일 릴리즈 배포와 디지털 서명 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 signwiza..

개발, 연습 2020.07.01

인스톨러 제작 프로젝트

visual studio installer package를 따로 받아 설치하면 새 프로젝트로 인스톨러를 만들 수 있는 프로젝트 목록이 나타난다. Visual Studio Installer Projects 빠른 설치파일 : InstallerProjects.vsix 이 프로젝트를 이용하여 이전에 만들었던 리버싱을 위한 프로그램을 개발했던 것들을 한 번에 설치하는 프로그램을 제작하였다. 각 프로젝트의 셋업 프로젝트를 제작하여도 되지만 셋업 위자드 프로젝트로 간단히 제작해도 된다. 프로젝트를 생성 시 직접 위자드가 나와서 파일을 add 하면 기본적으로 설치를 원하는 프로그램을 담고 있는 인스톨러를 제작하게 된다. 그 후에 프로젝트가 열리는데, Application Folder안에 설치파일이 담기게 된다. Use..

개발, 연습 2020.07.01

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

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

개발, 연습 2020.07.01

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

crackmes.one 에서 very easy 난이도의 크랙미 중 하나를 풀어보았다. by disip 로 되어있는 크랙미인데 시리얼미이다. readme에 의하면 자기가 만든 첫 크랙미라고 하고 난이도는 10점주자면 0점이라고 할 정도로 쉽다고 한다. NAME과 PASS를 입력하고 Register 버튼을 눌러 PASS를 맞추는 프로그램이다. 디버거로 열어서 DlgItemTextA 함수를 호출하는 곳을 찾았다. 총 두 번 호출 후 문자열의 길이를 비교해서 3보다 크면 함수를 호출한다. 함수는 루틴을 거쳐가며 시리얼을 반복을 통해 검사하는 것을 볼 수 있다. 루틴을 통해 NAME의 값을 시리얼로 통째로 어느 공간에 저장하는 것이 아닌 반복문에서 시리얼을 제작해 가면서 PASS 문자열과 계속 검사를 하게 된다...

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

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

개발, 연습 2020.07.01

crackmes.one 크랙미 3개 풀이

최근에 알게 된 사이트로 crackmes.one라는 사이트에 리버싱을 위한 크랙미가 많이 있다. very easy 난이도를 가진 것부터 시작했다. 여기 있는 모든 문제의 난이도는 very easy였던 걸로 기억한다. 이전에 작성된 풀이보다 좀 짧고 생략된 설명이 있을 수 있다. 1. crackme1.EXE 압축을 푼 폴더의 이름을 바꿔둬서 원 작성자가 기억이 나지 않는다. 비밀번호를 입력해 맞추는 형식이다. 크랙미 모듈로 들어가면 바로 보인다. 입력한 결과와 아래의 루틴을 통해 연산한 값으로 비교를 통해 틀림과 맞음을 구별. 연산은 문자열 각 한개씩을 비교해 가며 문자와 문자를 비교해 같거나 크거나 작음을 보고 edx를 가산/감산한다. 연산을 정리해서 key를 구하는 코딩을 하였다. -1, 1이 아니더라..