분류 전체보기 106

[리버싱 입문](14)[abex crackme 12, 13]

abex crackme 12 이번에는 프로그램을 실행하면 Nag Nag라는 창을 지워보라고 한다. 단순히 NagNag를 출력하는 MassageBoxA를 지워보겠다.이러면 NagNag를 출력하는 부분이 사라져 창이 뜨지 않는다.수정한 상태를 다른 파일로 저장하면 Nag창 없는 프로그램이 완성된다. -----------------------------------------------------------------------abex crackme 13 이번에는 또 올바른 시리얼을 입력하는 문제다.딱 봐도 수상해보이는 문자열이 보인다.이 문자열이 esi에 저장되긴 하는데 대체 뭔 역할을 하는지는 모르겠다.왜냐하면 값 비교는 이 문자열 말고 다른 거랑 한다... 실제로 판단하는 부분은 0040107D번지에 있는..

리버싱 입문 2025.02.26

[리버싱 입문](13)[abex crackme 11]

abex crackme 11 이번에는 만약 맞는 시리얼을 입력하면 correct를, 아니라면 문제를 만든 제작자 이름 창과 함께 Mal Cracker!!!라는 문자열이 보인다. 일단 main함수로 들어가서 살펴보겠다.안으로 들어오면 창을 띄우는 함수와 버튼 만드는 함수 등이 있고, 그 밑에 검사하는 함수(MSVBM60.6B5D3B1D)가 있다. 안에서 MSVBM60.6B5D3C84에서 입력을 받는다는 것을 알게 되었다. 함수가 호출되며 멈추는 부분을 계속 들어가며 분석하려 했지만 반복문과 함수 호출때문에 어려웠다. 따라서 그냥 호출되는 함수를 검색해 cmp를 찾기로 한다.검색 결과 vbaStrCmp가 있었다. 인자의 값을 보니 EAX엔 내가 입력한 1234567이, ECX에는 677345가 들어있었다. ..

리버싱 입문 2025.02.25

[리버싱 입문](12)[abex crackme 10]

abex crackme 10(abex crackme 9은 계속 바이러스 탐지에 걸려서 나중에 풀겠습니다.) 이번엔 뭔 프로그램인지도 보기 전에 프로그램이 꺼진다.맨 위에 IsDebbugerPresent라는 함수 때문이었다. https://learn.microsoft.com/ko-kr/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent에 따르면 사용자가 이 프로그램을 디버깅하는지 감시하고 디버거에서 실행중이라면 0이 아닌 값을, 디버깅 중이 아니라면 0을 반환한다.따라서 IsDebbugerPresent에서 0이 아닌 값을 반환하고 그걸 0을 비교해서 바로 프로그램을 꺼버리는 곳으로 점프했기 때문에 프로그램이 꺼진 것이다.조건문을 NOP로 바꾸고 다시 실행한..

리버싱 입문 2025.02.24

[리버싱 입문](11)[abex crackme 8]

abex crackme 8 이번에는 시리얼을 입력 후 check를 눌러 맞다면 correct가 뜬다. check 외에도 about, exit버튼도 있지만 딱히 중요하진 않다.불필요한 about, exit은 제외하고 사용자 값을 입력받은 이후에 점프한 곳을 보겠다.여기서 윈도우 핸들을 받아 GetDlgItemTextA를 통해 내가 입력한 값을 받는 것을 알 수 있다.https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-getdlgitemtexta 받고 난 이후에는 총 3개의 경우가 있다.- 시리얼을 입력했는데 틀린 경우- 시리얼을 입력하고 맞은 경우- 시리얼을 아예 입력 안한 경우correct가 뜨기 위해선 00401199에 있는 J..

리버싱 입문 2025.02.21

[리버싱 입문](10)[abex crackme 7]

abex crackme 7 이번에는 name과 serial을 입력하고 맞으면 correct를 띄운다. 그러나 만약 틀리면 아무 메세지도 출력하지 않고 초기화만 시킨다. 일단 check할 때 아무것도 출력하지 않으므로 문자열로 check찾는 것은 단념하고 차근차근 따져보겠다.시작 지점 근처 ThunRMain함수에서 실행이 멈춰버리니 이곳을 집중적으로 살펴보겠다.함수 내부는 다음과 같다. 하나씩 실행해보니 MSVBVM60.7524AD4C에서 창을 띄우고 MSVBVM60.75287BE7에서 입력과 비교를 하는 것 같다. MSVBVM60.75287BE7에서 점프해서 수상해보이는 vbaVarCmpEq, vbaVarCmpNe가 보인다.이름으로 추측하길 vbaVarCmpEq는 두 변수의 값을 인자로 받아 같은지 판단..

리버싱 입문 2025.02.20

[리버싱 입문](9)[abex crackme 6]

abex crackme 6 이번엔 cmd 창이 떠서 숫자로 된 비밀번호를 입력하고 만약 맞다면 correct를 띄운다. 일단 correct, wrong 문자열부터 검색해보면"password: "밑에 CMP와 JNE가 보인다. 아마 그 위에 있는 call 00428310에서 뭔가 할 것이라 예상할 수 있다.그래서 값이 같지 않으면 wrong으로 점프하는 것이다.또한 vba~~같은 함수 주석이 달리지 않고 지냥 주소로만 함수 지정을 해서 알기 어렵다. 각 함수의 동작을 따져보겠다. call 0043C248: 1줄씩 실행해본 결과 cmd창에 글자를 쓰는 함수임을 알게 되었다. call 00428310: 아마 함수 내부에서 글자를 입력할 때까지 동작이 멈추는 부분이 있는 것으로 보아 사용자 입력을 받고 스택에 ..

리버싱 입문 2025.02.19

[암호학 둘러보기](9)[해시]

해시 함수: 임의의 입력을 고정된 길이로 출력하는 함수h(M) = M'(해시 출력값)특징해시 함수로 나온 출력으로 입력을 예측하기 어렵다.같은 해시값을 갖는 서로 다른 입력값을 찾기 힘들다. (충돌 x)같은 입력을 넣는다면 출력도 당연히 같다.이산로그에 비해 해시는 매우 빠르다.쓰임디지털 서명: 원본 메세지 노출 없이 서명을 받을 수 있음메세지 무결성 검정: 메세지의 일부만 변경해도 해시값은 천차만별로 달라져 메세지가 수정되었는지 검증 가능데이터베이스 인덱싱종류: MD5, SHA, CRC 등...SHA-1: 가장 간단한 SHA 알고리즘반복적 연산으로 160비트의 해시를 출력한다.과정데이터 처리: 입력 데이터를 512의 배수로 만들기 (모자르면 패딩)초기 해시값: 가장 처음엔 이 값이 저장되어있음    레..

[리버싱 입문](8)[abex crackme 5]

abex crackme 5 이번에는 맞는 시리얼을 입력하고 버튼을 누르면 맞았다는 문구가 뜨면서 correct가 뜨는 문제다. 먼저 맞았다/틀렸다고 하는 문구가 바로 보이기에 이 부근을 중점으로 살펴보겠다.eax와 0을 비교해 만약 같다면 correct로 점프한다는 것을 알 수 있다.아마 위에 있는 lstcmpi함수에서 비교하고 같다면 0을 반환하는 것 같다. lstcmpi 알아보기lstcmpi함수의 안을 들여다 보니 ESI에 Enter your serial이란 문자열을, EDI에 L2C-57816784-ABEX라는 문자열을 집어넣고, 기타 등등의 매개변수를 집어넣는다. 이후 CompareStringA를 호출한다. https://learn.microsoft.com/ko-kr/windows/win32/ap..

리버싱 입문 2025.02.18

[컴퓨터 구조](21)[ELF와 링커심볼]

ELF: 실행가능하고 링크 가능한 포맷 (목적파일의 표준 바이너리 포맷)예) a.out(UNIX), PE(Windows) (리버싱 입문 정리 2 참고), Mach-O(Mac OS)종류재배치 가능 목적 파일(.o): 다른 목적파일과 결합될 수 있는 코드, 데이터 포함하는 파일, 하나의 목적파일은 하나의 소스코드에서 생성실행 가능 목적 파일(.out): 실행될 수 있는 형태의 파일 (링킹이 완료된 상태)공유 목적 파일(.so): 다른 프로그램과 공유될 수 있는 라이브러리 (windows의 DLL)구성ELF 헤더: 워드 크기, 바이트 순서, 파일 타입, 머신 타입 등 정의세그먼트 헤더 테이블: 페이지 크기, 가상주소메모리 세그먼트, 세그먼트 크기 정의.text: 컴파일된 프로그램의 기계어 코드.rodata: ..

CS/컴퓨터 구조 2025.02.17

[컴퓨터 구조](20)[링킹]

링킹: 여러 오브젝트 파일과 라이브러리를 결합하는 과정(컴퓨터 구조 7) 에 나온 링커가 수행링킹의 종류정적 링킹: 모든 코드, 라이브러리들을 하나의 실행 파일로 결합빠름, 그러나 실행 파일 크기가 커짐, 라이브러리 추가 어렵동적 링킹: 참조 정보만 포함하고 실행 시 필요한 라이브러리를 로드실행 파일 크기 작음, 쉽게 업데이트 가능, 그러나 로드해야되기 때문에 느림링킹의 필요성모듈화: 한 파일에 몰아넣는 것이 아니라 관리하기 쉽게 별도의 작은 모듈로 분할 가능, 라이브러리 사용 가능효율성시간적 효율성: 별도 컴파일 (하나의 소스 파일을 변경하더라도 다른 소스파일까지 다시 컴파일 할 필요 없음)공간적 효율성: 실제로 상요하는 기능에 대한 코드만 넣어 메모리 절약링킹 과정: 심볼 해석 -> 재배치예)// h..

CS/컴퓨터 구조 2025.02.14
728x90