목록리버싱 (16)
안 쓰던 블로그
main코드부터 본다 push rbp mov rbp, rsp sub rsp, 16 먼저 main 시작 전의 rbp레지스터 주소를 push로 스택에 넣는다. 이제부터 main함수에서 rbp가 베이스 포인터 역할을 하게 될 것이기 때문에 원래 가지고 있던 이전 rbp주소를 미리 저장해 두는 용도이다 mov로 현재 스택 포인터 rsp값을 rbp에 복사한다. rbp는 main의 스택 베이스 포인터로, main의 스택 프레임을 생성하는 부분이다 sub로 rsp에서 16을 뺀다. 스택에서 16바이트를 확보한다 mov DWORD PTR [rbp-4], 1 mov eax, DWORD PTR [rbp-4] mov edi, eax mov eax, 0 call sequare 스택의 rbp-4 에 1를 넣는다. 4바이트 변수..
레지스터 레지스터: CPU 내부에 존재하는 작은 고속의 다목적 메모리 저장 공간이라고는 하지만 일반적으로 말하는 메모리인 RAM과는 성격이 조금 다르다 CPU가 RAM에 있는 데이터에 접근하기 위해서는 물리적으로 돌아가야 하기 때문에 오래 걸리지만, 레지스터는 CPU 내부에 존재하기 때문에 더 빠른 연산 속도를 갖는다 종류로는 범용, 세그먼트, 상태 플래그, 명령 포인터 레지스터 등등.. 이 있다 범용 레지스터 이름 그대로 '범용'적으로 쓰이는 레지스터 계산, 메모리 주소 지정, 임시 저장 공간 등의 목적으로 사용되며 32bit로 구성된다 EAX: 입출력, 산술, 논리 연산을 수행하는 누산기 레지스터로 함수의 리턴값을 저장한다(32비트) AX: EAX의 하위 16비트(AX에서 확장 Extended되었다고..
아래 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 데이터..
.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파일을 하나 주는데 실행할 수 없다고 뜬다. 이걸 실행되게 만드는 게 문제 PEview로 파일을 가져오면 모든 아이템을 이쁘게 볼 수 없다는 에러가 뜬다 왜냐면 원래 있어야 할 섹션 부분이 없기 때문이었다 파일마다 섹션은 다 있어야 하고, 보통 .text, .rdata, .data 3개 정도는 있어야 프로그램 코드를 읽을 텐데 이 부분이 없어서 실행이 되지 않고 있었다 섹션이 원래 몇 개였는지 할 수 있는 방법 IMAGE_NT_HEADERS->IMAGE_FILE_HEADER Number of Sections가 0이라서 섹션이 다 지워져 버린 것 여기까지 0xCE부분 주소를 확인하고 닫은 뒤(동시 실행이 불가함) 해당 부분 수정하기 위해서 HxD에서 열어 준다 HxD를 열었으면 먼저 수정할 곳을 찾..