목록CTF (63)
안 쓰던 블로그
아래 local 이라는 이름의 지역변수와 global이라는 이름의 전역 변수를 선언한 c언어 코드가 있다 #include "stdafx.h" #include int global = 1; int main(int argc, char* argv[]){ int local = 2; return 0; } 다음 C코드는 아래 같은 형태로 컴파일 된다 mov byte ptr [ebp-4], 1 mov byte ptr [ebp-8], 2 실제 컴파일된 코드는 다음과 같다 local 이름의 변수는 2번에 번역되었다 mov byte ptr [ebp-4], 2 그런데 global 이름의 변수는 분명 1로 초기화 했음에도 불구하고 코드가 존재하지 않다 1번 main 함수 주변에도 해당 코드가 없다 그러면 c코드를 이렇게 바..
메모리 구조 프로그램이 실행되면 로더에 의해서 디스크에서 주기억장치로 프로그램이 적재된다 프로그램은 메모리 상에서 4가지 세그먼트로 나뉘어 스택 형태로 구현된다 일반적으로 컴파일러들은 이런 식으로 실제 코드 부분/데이터 부분을 개념적으로 구분해서 사용한다 물론 이게 물리적으로 딱 정해진 것이 아니라, 사용자가 어디서부터 어디는 코드 영역, 어디는 데이터 영역이라고 임의로 구분해서 사용하는 것일 뿐이다 CPU나 메모리 같은 헤드웨어 입장에서는 값이 데이터인지 코드인지 구분하지 않는다 1. 코드 세그먼트 프로그램 소스코드 저장 2. 데이터 세그먼트 전역변수 global, 정적변수 static, 배열 array, 구조체 structure 등이 저장된다 초기화 된 데이터는 이곳에 저장된다 2-1. BSS 데이터..
FAT 파일 시스템 구조: https://foxtrotin.tistory.com/258 NTFS는 현재 윈도우즈에서 가장 많이 사용되는 파일 시스템 Spec이 완전히 공개되지 않음. 마이크로소프트에서 서버용 파일시스템으로 사용하기 위해 만들었다 Boot Record: FAT File System보다 간단한 구조 MFT: NTFS 파일 시스템의 구조를 가지고 있음. 실제 Data영역에 넘어갈 수 있는 정보를 가짐 Data: 데이터가 저장되는 영역, 클러스터 Cluster단위로 읽고 쓴다 NTFS Layout 1) Boot Record: BR NTFS의 내용 중 유일하게 고정되어 있는 구조체 BR로 MFT에 접근 섹터 당 바이트 수, 클러스터 당 섹터 수, 볼륨 크기, MFT 등등의 정보를 가진다 BR 구조..
Partition 파일 시스템을 보기 전에 파티션과 MBR에 대해 짚고 가겠습니다 파티션 Partition은 연속된 저장공간을 하나 이상의 연속되고 독립된 영역으로 나누어서 사용할 수 있도록 정의한 규약이다 파티션을 나누는 이유는, OS영역과 Data영역을 분리하여 사용하기 위해, 저장 공간을 효율적으로 사용하기 위해, 여러 개의 OS를 하나의 시스템에서 사용하기 위해서 등이 있다 DOS Partition은 MBR과 BR로 구성된다 MBR: BR을 호출하기 위한 Boot code, Partition Table을 가지며, 디스크의 첫 512 Bytes를 차지한다 BR: 각 파티션의 첫 번째 섹터에 위치한다 MBR MBR은 Boot Code, Parition Table, Signature로 구성되어 있다 실..
.exe파일을 실행하면 keyfile을 찾을 수 없다고 뜬다. 알맞은 키파일을 생성해서 성공 메시지를 띄우는 문제 (단, 코드 수정을 하지 않는다) 스터디 숙제로 제공된 파일이라 실제 문제와 이름 등이 약간 다를 수도 있습니다 F9로 실행시키면 Entry Point 00401000으로 이동하고, 그 아래 찾고자 하는 부분이 문자열 찾을 필요도 없이 바로 나온다 윈도우즈 API 함수들이 보이는데, MessageBox나 CreateFile, GetFileSize 등이 API함수다 프로그램이 시작되자마자 스택에 MessageBoxA에 함수에 들어갈 인자를 채우기 시작한다 push 0은 uType MB_OK crackme라는 InCaption keyfile찾으라는 Text push 0으로 hWind 오른쪽 아래..
.exe파일을 실행하면 patch me라는 메모장이 뜨는데, 이걸 well done으로 바꾸라는 문제 메모장에 문자열이 있어서 참조할 게 없으니까 그냥 쭉 실행을 해 본다 중간에 걸리면서 메모장이 뜬다 근데 여기가 cmp의 결과를 jne해서 넘어오는 작업을 하고 있다 (브레이크 포인트 부분) 정리하면 위에서 어떤 계산의 결과값으로 cmp를 비교한 후 맞으면 f.txt를 열고, 아니면 s.txt를 여는 프로그램이었다 (그리고 문자열에 들어있는 경로에 들어가면 그 파일이 실제로 있더라) jne이기 때문에 je로 바꿔주면 간단하게 분기문을 바꿀 수 있다 바꾸고 파일 패치 후 실행 분기문을 바꾸지 않고 코드 분석을 통해 하는 방법도 한 번 해 보겠다 주변 코드를 보면 cmp로 ebp-4를 0과 비교하는데, 이 ..
.exe파일을 실행하면 계산기가 실행되는데, 메모장이 실행되게 하는 문제 일단 올리디버거로 열어준다 브레이크 포인트 걸고 F9로 여기까지 이동 push로 calc.exe문자열을 넣어주고 call을 해서 계산기를 실행시키고 있다 즉, call은 시스템 함수임을 알 수 있다 시스템 함수는 notepad.exe를 하면 메모장이 열리고 그런 의미다 우클릭-덤프에서 따라가기로 00406030 주소로 이동하면 calc.exe가 있다 이 부분을 notepad.exe로 바꾸면 될 것이다 바꾸는 건 아스키코드표에 HEX값 참고해서 바꿔준다 덤프 창에서 해당 부분 스페이스바 누르면 바꿀 수 있다 notepad.exe = 6E 6F 74 65 70 61 64 2E 65 78 65 근데 이 부분이 덮어쓰기를 하는 거라 지금은..