전체 글 252

[리버싱 입문](19)[Lena 6]

Lena가 만들어진지 오래되었다 보니 일부 문제는 실행이 잘 안되네요ㅠㅠLena 5는 나중에 풀겠습니다. Lena 6 이번에는 앱이 창을 하나 띄우고 작동하지 않는다.근데 이건 내 윈도우와 프로그램 간 호환성의 문제였다.따라서 XP로 호환성을 변경해서 열어 실행했다.또한 ollydbg에서 예외처리를 무시하게 해 중간에 멈추지 않고 실행하게 했다.이번에도 실행하자마자 unregistered version이라고 뜬다.또한 5일동안 밖에 못 쓰게 되어있다.여기저기 눌러보다 보니 reg key를 사용해 register할 수 있다는 것을 알 수 있었다. 문자열 찾기로 register key를 검사하는 곳을 찾을 수 있다.위에서 올바른 버전에 엑세스 하는지 검사하고, 올바른 버전이라면 key를 검사하고 regist..

리버싱 입문 2025.03.13

[리버싱 입문](18)[Lena 4]

Lena 4 파일을 켜서 시키는대로 설치하면 몇몇 기능이 제한된 UNREGISTERED 버전이 설치된다. 이것을 REGISTERED 버전으로 우회해야한다일단 설치 관리자를 뜯어봤다.여기서 REGISTERED인지 검사해서 다른 파일을 설치해주나 라고 추측했으나, astrum installer로 설치 파일을 만들었다는 것 빼고는 별다를 건 없다. 처음부터 그냥 UNREGISTERED버전으로 깔리는 듯 하다. 설치된 프로그램을 살펴본다.register이라는 문자열로 찾아본 결과, register를 하지 않으면 새 그룹 만들기가 3개로 제한이 걸리고, 인원 제한 4명이 걸리는 것을 알 수 있다.- 그룹 만들기 제한 해제CMP EAX, 3과 JL로 3명 이하인지 판단한다. 따라서 이 부분은 그냥 JMP로 바꿔주면..

리버싱 입문 2025.03.12

[리버싱 입문](17)[Lena 3]

Lena 3 이번에는 Nag창을 없애면 register할 수 있다고 한다.처음에 GetModuleHandleA로 핸들을 받고 0과 비교해서 맞다면 분기가 나눠진다.https://learn.microsoft.com/ko-kr/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlea에 따르면, 매개변수가 Null일 경우에는 이 함수를 부른 파일의 핸들을 반환한다고 한다. 따라서파일 헤더의 주소인 400000을 반환한다. 따라서 항상 Nag창이 뜰 수밖에 없다.EAX가 0이어야 첫번째 Nag창을 건너뛸 수 있으나, EAX엔 언제나 00400000이 저장된다. 따라서 그냥 점프하는 부분을 바꿔주겠다.첫번째 Nag창은 점프로 해결하였다.두번째 Nag창은 아..

리버싱 입문 2025.03.11

[리버싱 입문](16)[Lena 2]

Lena 2 이번 문제는 Lena 1과 동일하지만 다른 방식으로 풀어보라고 한다.이번에는 아예 파일을 패치해서 풀어보겠다. 먼저 CreateFileA로 파일이 있는지 검사하는 부분부터 손보겠다.JNE를 JMP로 바꿔주면 키파일이 있던 없던 항상 다음 단계로 진행한다. 이후 ReadFile 밑에 있는 조건들도 각각- 파일을 못 읽었을때도 무조건 다음으로 점프하기- 파일의 크기가 16미만이어도 아무런 행동 하지 않기- G가 8개 미만이어도 wrong으로 점프 안하게 만들기를 해주고 저장하면 언제나 correct가 뜬다.

리버싱 입문 2025.03.10

[리버싱 입문](15)[Lena 1]

Lena 1 이번 문제는 실행하면 파일을 구매하지 않았다는 창만 뜬다. 이 구매 여부를 우회해야 한다  조건문 위를 보면 CreateFileA가 보인다. (리버싱 입문 5 참고)매개변수를 보면 Keyfile.dat가 있다면 열고 없으면 오류로 EAX에 2가 저장되어 구매 창이 뜬다.따라서 Keyfile.dat파일을 해당 문제와 같은 디렉터리에 생성한 후 다음으로 넘어가겠다.  키파일이 있는지 검사한 후에는 ReadFile로 파일을 읽는다. 그냥 빈 키파일이면 vaild keyfile이 아니라고 한다.not valid가 뜨는 이유- https://learn.microsoft.com/ko-kr/windows/win32/api/fileapi/nf-fileapi-readfile 를 보면 실패하면 0을 반환한다...

리버싱 입문 2025.03.07

[컴퓨터 구조](27)[동적 메모리]

동적 메모리 할당: 실행 중에 메모리를 할당heap공간의 메모리 영역이 할당됨명시적 할당: 프로그래머가 직접 메모리 할당 관리예) C의 malloc & free묵시적 할당: 시스템이 메모리 할당 관리예) JAVA의 가비지 컬렉션C의 동적 메모리 함수malloc(size): size만큼의 동적 메모리 할당성공하면 메모리 블록 포인터 리턴실패하면 Null 리턴 후 errno 설정free(포인터): 포인터에 있는 공간을 할당 해제malloc 등의 동적 메모리를 쓰고 나서 반드시 해야됨. (안하면 계속 공간 차지 -> 메모리 누수)기타calloc: 블록을 할당하고 0으로 초기화함realloc: 이전에 할당된 블록의 크기 변경sbrk: 힙을 늘리거나 줄이기 위해 사용메모리 할당의 제약할당된 블록의 수, 크기 제어..

CS/컴퓨터 구조 2025.03.06

[컴퓨터 구조](26)[가상메모리 동작]

가상메모리는 프로그램이 사용하는 메모리를 페이지 단위로 나누고 불러오거나 지운다. PTE: 가상 페이지를 물리적 페이지에 대응시키는 테이블페이지 테이블: PTE의 배열    페이지 테이블에 요청한 가상주소에 대응하는 물리주소가 있으면 페이지 적중    페이지 테이블에 요청한 가상주소에 대응하는 물리주소가 없다면 페이지 오류    페이지를 하드디스크에서 불러옴 (메인 메모리에 불러올 공간이 없다면 다른 페이지 지우고 불러옴) -> 해당 PTE업데이트 -> 프로그램 재실행    페이지 오류로 인해 미스 패널티 발생 MMU: 메모리 관리 장치- 가상주소 -> 물리주소로 바꿔줌(페이지 테이블 참조)- 권한 검사- 페이지 폴트 처리 가상메모리의 동작: 마치 캐시처럼 동작 (컴퓨터 구조 19 참고)    CPU가 ..

CS/컴퓨터 구조 2025.03.05

[컴퓨터 구조](25)[가상 메모리]

가상 메모리: 가상 주소 공간을 사용마치 한 프로그램 혼자서 메모리를 사용하는 것 같게 함.메인 메모리를 효율적으로 사용: 필요한 내용만 하드디스크에서 불러옴.메모리 관리 간소화: 프로그램은 각자 일정 크기의 연속적인 메모리 공간을 사용한다 알고 있음.실제 물리적 관리는 운영체제가 하고 프로그램은 신경 안씀.주소 공간 격리: 메모리에 간접 접근, 프로그램마다 메모리 분리 -> 보안성 좋음한 프로세스는 다른 메모리에 끼어들 수 없음. 필요할 때만 서로 공유사용자 프로그램이 권한있는 커널 정보나 코드에 엑세스 불가메모리 관리를 위한 가상 메모리: 메모리를 단순한 선형 배열로 볼 수 있다.메모리 할당 단순화: 단순 선형 배열의 메모리 구조, 독립적이고 정해진 크기의 공간이라 단순함.프로세스 간 코드 및 데이터..

CS/컴퓨터 구조 2025.03.04

[컴퓨터 구조](24)[프로세스 생성 & 종료]

프로세스의 생성과 종료(UNIX) pid: 프로세스 식별자    운영체제에서 각 프로세스를 식별하기 위해 부여한 번호. 일반적으로 양의 정수로 부여된다.(pid가 음수면 오류로 취급) 프로세스에서 자식 프로세스를 만들거나 종료할 수 있다. 프로세스 생성: fork()int fork(void)의 함수 형태이며 자식 프로세스를 생성한다. 자식 프로세스엔 0을, 부모 프로세스에는 자식의 pid를 반환한다.자식은 부모와 거의 동일하지만 pid가 다르고 다른 메모리 공간을 사용한다. 또한 독립된 프로세스여서 서로 영향을 주지 않는다.예)int main(){ pid_t pid; int a = 3; pid = fork(); //자식만 실행// if (pid == 0) {printf("child..

CS/컴퓨터 구조 2025.03.03

[컴퓨터 구조](23)[프로세스]

프로세스: 실행중인 프로그램의 동적인 실행 단위(즉, 실행중인 프로그램을 운영체제가 추상화한 것)(프로세스는 프로그램, 프로세서와는 다르다.)    프로그램: 코드와 데이터가 저장된 파일    프로세서: CPU  프로세스 상태    실행: 프로세서가 프로세스를 실행중인 상태    준비: 실행할 준비는 되었지만, 아직 운영체제에서는 실행 안된 상태    차단: 특정 작업을 수행해서 다른 이벤트가 발생하기 전까지 준비가 되지 않은 상태    - 상태 변화        준비 -> 실행: 프로세스가 스케줄링됨        실행 -> 준비: 프로세스 스케줄 취소        차단 -> 준비: 일시적으로 차단되었다가 준비 상태로 복귀(컴퓨터 구조 9 참고)프로세스 추상화논리적 제어 흐름: 각 프로세스마다 CPU를 ..

CS/컴퓨터 구조 2025.02.28

[컴퓨터 구조](22)[제어흐름변경]

일반적으로 프로세서는 프로그램의 흐름이 순차적이라 생각하고 동작, 그러나 제어 흐름이 바뀔 때가 있다.명령어로 제어 흐름 변경: 전통적으로 제어 흐름을 변경하는 방법점프(JMP), 분기콜(CALL), 리턴-> 여러 환경에서 유연하게 작동하지 않음예외적인 제어 흐름 변경: 제어 흐름에 갑작스런 변화를 만들어 유연하게 처리할 수 있게함컴퓨터의 모든 수준에서 발생예) 키보드 입력, 커널 수준의 문맥 전환, 응용 프로그램에서의 전환 등예외상황: 일부 이벤트에 대한 응답으로 OS커널에 대한 제어 이전유저 코드에서 특정 이벤트 발생 -> 커널에서 예외처리 -> 유저코드 다음 줄로 복귀예외 테이블: 각 이벤트마다 고유 번호, 핸들러(예외 처리하는 코드) 주소 저장예외 분류동기적 예외: 현재 명령어 실행 중에 발생하는..

CS/컴퓨터 구조 2025.02.27

[리버싱 입문](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
728x90
반응형