개인 공부 (52) 썸네일형 리스트형 Bandit 30 ~ 32 Bandit 30 -> 31 1. There is a git repository at ssh://bandit30-git@localhost/home/bandit30-git/repo. The password for the user bandit30-git is the same as for the user bandit30. Clone the repository and find the password for the next level. ※ Bandit30 PW : xbhV3HpNGlTIdnjUrdAlPzc2L6y9EOnS ※ git tag : 특정 커밋을 태그해 두는 것 ※ git show [tag] : 태그된 내용을 확인 01. git clone을 통해 ssh://bandit30-git@localhost:222.. Reverse Engineering-005 DLL 분석 DLL(Dynamic Link Library) - 동적 링크 라이브러리 마이크로소프트 윈도위에서 구현된 동적 라이브러리 실행 파일에서 라이브러리 기능을 사용 시에만 참조하여 기능을 호출한다 DLL의 번지 계산 DLL 버지 계산 : Image Base(Base Address) + Base of Code PE view를 통해 PE헤더를 통해 Image Base를 확인할 수 있다!! ※대부분 DLL의 Image Base 0x10000000 번지로 설정되어 있다(exe파일은 0x400000) 재배치(re-allocation) 번지가 매번 바뀌는 경우 재배치를 통한 DDL 번지 확인한다 Image Optional Haeder에서 Image Base를 보면 0x10000000 번지로 설정되어 있다면 d.. 네트워크P-006 (데이터 전송 방식) 데이터 전송 방식 응용 프로그램 프로토콜 응용 프로그램 수준에서 주고받는 데이터의 형식과 의미 처리 방식을 정의한 프로토콜 TCP 데이터 전송 TCP 통신 OS 레벨에서 데이터를 보내면 send 버퍼에 있는 내용물이 recv 버퍼에 들어가는 것 까지 OS에서 보장을 해준다 OS 레벨에서 데이터를 보내면 데이터를 받았다는 응답을 다시 보내게 된다 보낸 측에서는 제대로 받았다는 패킷이 오기 전까지 send 버퍼의 내용물을 지우지 않는다 해당 패킷을 확인하고 OS가 버퍼의 내용을 지운다 TCP 특징 데이터의 경계가 없고 연속적 전송 1 : 1 통신이라는 것은 연결되어 있는 것 끼리만 데이터를 주고 받음을 통해 확인 TCP 프로그램에서 오류가 가장 많이내는 케이스가 데이터 경계가 없는것 메시지 경계 구분 송신자.. Reverse Engineering-004(C++) C++ 분서의 난해함 C 코드의 경우 함수, 조건문, 반복문 등 일정한 규칙이 있다(절차지향) C++ 에서는 클래스(멤버 변수, 멤버 함수, 생성자, 소멸자), 캡슐화, 상속등이 추가(객체지향) C++와 어셈블리는 1:1 매칭이 되지 않으므로 직관적으로 파악하기 쉽지 않다 가장 필요한거는 리버서의 풍부한 코딩 경험!!! 분석 할 간단한 C++ 코드 #include #include "windows.h" #include "tchar.h" // namespace : 함수나 구조체 혹은 변수 이름등의 소속을 정해주는 것 using namespace std; // std::cout, std::cin 등을 해당 파일에서 std:: 때고 사용! class Employee {// 직원의 정보에 대한 C++ 클래스 pu.. 네트워크P-005(TCP Server, TCP Client ) TCP Server - Client 웹 클라이언트(브라우저)는 사용자가 입력한 주소를 접속 대기 중인 웹 서버에 접속 후 HTTP를 이용해 요청 웹 서버는 웹 클라이언트에게 요청받은 메시지를 분석 후 HTTP를 이용해 응답 메시지를 만든다 - 데이터 교환 과정 두 프로그램 간의 연결을 위해 연결 설정을 해야 한다 서버 프로그램 : 연결을 위해 포트를 열어놓고 연결 요청이 오기를 기다린다 클라이언트 프로그램 : 서버 포트로 연결 요청을 보낸다 서버는 먼저 실행되어 클라이언트가 접속하기를 기다린다 --> listen() 클라이언트는 서버에 접속--> connect(), 데이터를 보낸다 --> send() 서버는 클라이언트 접속을 응답 --> accept(), 클라이언트 보낸 데이터를 받아서 처리 --> re.. Reverse Engineering-003(구조체 & API) 구조체와 API Call ※ 구조체 : 사용자가 여러가지 타입을가지고 새롭게 정의하는 사용자 정의 타입!! ※ API(Application Programming Interface) : 프로그램들이 서로 상호작용한는 것을 도와주는 매개체 구조체의 각 멤버 변수가 어떤식으로 사용되는지 확인 리버스 엔지니어링 할 때는 스택 포인터만 보고 구조체 크기가 얼마인지 확인 API인자로는 어떤 것이 들어가는지 파악하는 것이 필수!! #include #include void RunProcess() { STARTUPINFO si;// 생성화는 프로세스 속성을 지정할 때 사용 PROCESS_INFORMATION pi;// 새로 생성된 프로세스와 기본 스레드에 대한 정보가 있다 // ZeroMemory() : 메모리 영역을 .. 네트워크P-004(소켓 구조체 & 바이트 정렬) 소켓 주소 구조체 구체적인 주소를 표현하기 위한 주소 체계(address family) 네트워크워크 프로그램에 필요한 주소 정보를 담고 있는 구조체, 다양한 소켓 함수의 인자 사용 프로토콜 체계에 따라 다양한 형태가 존재한다 기본형은 SOCKADDR 구조체 winsock2.h에 포함되어 있다 /* ===== Windows ===== */ #include /* ===== Linux ===== */ #include struct sockaddr{ unsigend shortsa_family;// address family : 2Byte charsa_data[14];// IP주소 + Port Number : 14Byte } sa_family : 주소 체계를 나타내는 부호 없는 16bit(2Byte) 정수 값 sa.. Reverse Engineering-002(문법) 함수의 기본 구조 리버스 엔지니어링의 기본을 익히기 위해서는 함수에대해 잘 알아야한다!! (소스코들은 많은 함수로 구성) 크게 함수가 하는 기능, 세세하게 파라미터 개수, 리턴값으로 어떤 값들이 전달되는 지 분석해야함 분석 시 주의할점 ! 빌드시에 컴파일러가 자동으로 생성해내는 코드를 필터링해야한다!! /* ========== 함수의 기본구조(C) ========== */ int sum(int x, int y){ int sum = x + y; return sum; } /* ========== 디스 어셈브링한 코드 ========== */ pushebp// 베이스 주소를 스택에 저장 mov ebp, esp// 현재 스택포인터를 ebp로 바꾼다 pushecx mov eax, [ebp+arg_0]// eax에.. 이전 1 2 3 4 5 6 7 다음