분류 전체보기 106

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