본문 바로가기

모의해킹/리버싱

(33)
rev-basic-0 chall0.exe을 실행시키면 Input 이 출력이 되면서 임의의 숫자, 문자를 입력을 하니, 프로그램이 종료된다. 프로그램에서 원하느 문자를 입력해야지 프로그램이 종료가 안된다고 추측할 수 있다. 디버깅툴을 사용하여 프로그램을 열었을 때, Correct 랑 wrong 문구가 보인다. Coorect 문구가 적혀있는 위 주소를 보면 je chall0 7FF74D0D1166 메모리가 적혀있는 걸 볼 수 있다. 즉, text eax, eax에서 비교를 해서 참과 거짓을 구별하는 거 같다. 그렇기에 우리가 찾아야할 correct 출력 값은 chall chall0.7FF74F0D1166에서 호출이 된다는 걸 추측할 수 있다. "Compar3_the_str1ng" 문자열과 내가 입력했던 "aaaa" 문자열을 비교..
Run-Time Packer • Packer Packer의 사용목적은 PE 파일의 크기 감소를 통해 네트워크 전송에도 용이하고 보관하기도 좋다. 또한 파일 내부의 코드와 리소스 등을 감출 수 있어 압축된 데이터는 알아보기 힘든 형태의 Binary로 저장되어 내부 내용을 감춰준다. • Protector PE 프로텍터란 PE 파일을 리버싱으로 부터 보호하기 위한 유틸리티이다. -> 리버싱을 막기 위한 다양한 기법(Anti - Debugging, Anti-Emulating, Code obfuscating, Garbage Code 등)이 추가된다. -> 압축된 PE 팡일의 크기는 원본 PE보다 커지는 경향이 있으며 디버깅하기 어렵다. 사용목적으로는 크래킹 방지 & 코드 및 리소스 보호의 목적이다. -> 크래킹에 민감한 보안 프로그램들이 프..
PE Format • PE Format 정의 PE(Portalbe Executable)는 Winodws 운영체제에서 사용되는 실행파일 형식을 의미한다. Windows 운영체제의 가장 핵심적인 부분은 Process, Memory, DLL 등이다. PE의 종류 - 실행 파일 계열 : EXE, SCR - 라이브러리 계열 : DLL, OCX - 드라이버 계열 : SYS - 오브젝트 파일 계열 : OBJ • VA & RVA VA(Virtual Address)는 프로세스 가상 메모리의 절대주소를 말한다. RVA(Relative Virtual Address)는 어느 기준 위치(base address) 에서부터의 상대주소를 말한다. VA와 RVA 관계는 RVA + base address = VA • DOS Header 구조체에서 가장 ..
Doom2(핵 만들기) 보호되어 있는 글입니다.
레지스터 (Register) • 레지스터란? - CPU 내부에 존재하는 다목적 저장 공간이다. - 소규모 데이터 기억장치이다.(산술/연산 가능) - 일반 메모리보다 빠른 속도를 가진다. - AX 레지스터 입출력과 대부분의 산술, 논리 연산에 사용되며, 함수의 반환값이 AX 레지스터에 저장된다. - BX 레지스터 메모리 주소를 저장하기 위한 용도로 사용된다. - CX 레지스터 반복 명령어 사용 시 반복 횟수로 사용되는 레지스터이다. - DX 레지스터 AX 레지스터와 같이 쓰이고 부호 확장 명령 등에 쓰이며 산술/논리 연산 보조 역할을 한다. - 포인터 레지스터 (메모리 스택 영역과 관련된 주소 값을 나타낸다) ESP(Stack Pointer) : 스택 영역의 최상단을 가리킨다. EBP(Base Pointer) : 스택 영역의 기준이 ..
Stack (스택) • Stack(스택) - 메모리의 한 부분으로 먼저 들어간 게 최후에 나가는 자료구조 -> LIFO(Last Input First Output) 구조 - 함수 내의 로컬변수 임시 저장 - 함수 호출 시 파라미터 전달 - 복귀 주소(return address) 저장 • Stack Frame ESP(스택 포인터)가 아닌 EBP(베이스 포인터) 레지스터를 이용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소 등에 접근하는 기법이다. ESP 값은 프로그램 안에서 수시로 변하기 때문에 EBP를 함수 시작 전에 저장하고 유지하면 안전하게 변수, 파라미터, 복귀 주소등에 접근할 수 있다. • 실습(Stack Frame) 소스코드에서의 main의 위치를 찾는다. 00401026 주소를 실행시키면 ebp로 부터 4떨어진..
리버싱 기본명령어 • 명령어 실습 - jmp [ADDR] 해당 주소로 EIP 변화 (해당 주소를 점프함) 00401004 주소에서 00401007 주소로 EIP 변경 F7로 한 줄씩 실행시키면 00401006 주소를 안 지나감 - push [REG] : REG값을 스택에 채움 push 100 명령을 사용하면 스택 공간에 쌓인다. - pop [REG] : 스택에서 값을 빼서 REG에 채움 스택에 쌓여있던 100이 EAX에 넣어준다. - call [ADDR] : 현재 EIP를 스택에 Push 하고, 피연산자로 EIP 변화 call 명령어를 실행시키면 스택에 call 명령어 실행이 끝나면 00401016 주소 밑에 있는 0040101B 주소로 return 할 수 있게 스택에 쌓인다. - ret : 스택의 값을 빼서 EIP 변화..
Code Engn (Basic RCE L01) cmp로 eax 랑 esi 비교를 해서 ZF가 1이 아니라서 점프를 안 하게 되어 Error 메시지가 출력이 된다. 즉, 해당 부분을 점프로 성공 메시지를 출력 시키게 하면 되는 문제이다. 그렇기에 je를 jne는 ZF가 0이면 점프를 하기 때문에 jne로 수정을 해준다.