전체 글 507

DLL injection

DLL 인젝션을 하는 이유와 알려진 방법들CreateRemoteThread() API 활용가장많이 사용되는 방법레지스트리에서 AppInit_DLLs 값을 변경해서 인젝션HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\WindowsSetWindowsHookEx() API 활용  TCP Socket API hookChatting client/server 예제를 활용해 Winsock API를 hookServer는 전형적인 멀티스레드 기반으로 구현(접속하는 클라이언트 마다 스레드 생성)본 수업에서 예제 차제는 설명하지는 않음최초 Client 코드 수준에서 Hook 관련 코드를 추가해 동작을 확인하고 DLL Injection 기능을 추가하는 방식으..

Inline hook

inline hook 기술 개요 및 작동 원리함수의 진입점(function prologue)에 jmp code(0xE9)를 삽입해서 흐름을 변경하는 방법32bit 시스템에서 jmp 코드 피연산자는 점프할 위치에 대한 절대값이 아니라 현재 명령어가 저장된 위치를 기준으로 떨어진 거리를 상대적으로 계산한다.jmp code는 명령어와 피연산자를 포함 모두 5바이트 (x86기준)inline hook 사용시 주의사항jmp 코드로 흐름을 조작하더라도 정상적인 호출관계에 의한 stack frame 구조를 손상시키지 말아야한다. (function prologue , epilogue가 정상적으로 동작해야함)조작된 흐름이 끝나고 본래 위치로 되돌아 가는 과정에서 문제가 발생하지 않도록 강제화 해야한다. 32bit inli..

IAT hook

IAT = Import Address TableDLL 에서 가져다 쓴 함수들에대한 정보들을 가지고 있다고함묵시적인 로딩인 경우에만 남아있는다 PE (portable excutable) 파일 구조https://github.com/corkami/pics/blob/master/binary/pe101/pe101.pdf RVA (Relative Virutal Address)dll 이 가상메모리에 로딩이 되고 어떤 함수가 어디에 써있느냐를 나타낼떄 RVA를 통해 나타낸다. IAT hook 기술 개요실행 파일이 가지고 있는 IAT 영역 정보를 직접 조작하는 방식으로 피호출 API함수를 변경하는 기법C 언어 기반 응용 프로그램의 주요 함수들은 별도의 C Runtime Library(DLL) 로 구현되어 있으며 프로그램..

사전지식 - 두 번째

가상 메모리 접근 모드메모리에 대한 접근 권한은 보통 3 가지로 분류read ,write ,execute타 프로세스 메모리에 대해서도 권한이 잇다면 접근가능debugger가 그러하다VirtualProtect 라는 함수가 가상메모리 접근모드를 조절하는 함수이다.int main(){ const char* pszHello = "Hello World!\n"; std::cout (pszHello); //pszNewHello[4] = '\0'; DWORD dwOldProtect = 0; ::VirtualProtect( (LPVOID)pszHello, 8, PAGE_READWRITE, &dwOldProtect); pszNewHello[4] = '\0'; std::co..

사전 지식 - 첫 번째

함수 포인터C언어에서 함수의 이름은 실행코드가 저장되는 메모리의 주소디버거로 대상 메모리 내용 확인 가능디스어셈블 기능을 이용해서 명령 단위 실행으로 역추적 가능함수 포인터는 대상 플랫폼에 따라 32bit 혹은 64bit로 달라질 수 있다.Callback 구조 적용에 적합하다.소위 API라는것들은 모두 함수로 구현되며 일반 함수 포인터와 동일한 개념이 적용된다.calling convetion__cdecl (호출자가 스택정리)__stdcall (피호출자가 스택정리)__fastcall (매개변수에 레지스터 사용)64bit에서는 요게 기본이다.int(__cdecl * pfTest)(int, int) = testFunc 처럼 함수포인터에서 써줘야한다.함수 프롤로그 와 에필로그함수 내부에서 사용된 자동변수는 스택..

24) DBMS 활용 (배치 처리 주의사항)

대용량 작업개발자 생각최대한 굵고 짧게동시에 많은 스레드로 빠르게 처리 완료중요한 쿼리들이 실행되지 못할 수 도 있다.DBA 생각가능한 가볍게 ( 가능한 짧게 )소수의 쓰레드로 최소의 DBMS자원 소모 dbms서버는 공유자원특정 서비스에서 과도한 자원 점유시, 다른 서비스의 처리 지연 유발때로는 다른 서비스의 쿼리실패 & 장애 유발DBMS 서버의 처리 용량은 다양하다. 이에 맞는 동시성 제어가 필요하다. Long TransactionIdle Transactionauto_commit = OFF 상태 또는 명시적 트랜잭션 (Begin Transaction) 사용시에Begin 이후 또는 쿼리 실행 이후 대기 상태로 남은 트랜잭션 (Commit , Rollback 실행 전)Active long transacti..

23) 테이블 파티셔닝

테이블 파티셔닝하나의 테이블을 물리적으로 여러 테이블로 분할해서 데이터를 저장하는 기법사용자는 기존처럼 하나의 테이블로 인식해서 사용 가능하다.테이블의 특정 컬럼이나 계산식을 기준으로 해서 날짜 / 숫자 범위나 리스트, 해시 형태 등으로 분할이 가능하다. 테이블 파티셔닝이 필요한 이유삭제 가능한 이력 데이터들을 효율적으로 관리할 수 있다.e.g) 로그성 데이터들이 저장되는 테이블에 파티셔닝이 적용된다.보관기간에 따라 일정기간 지난 데이터들을 제거하는 경우, 데이터 삭제가 아닌 파티션 드랍으로 처리명령문 하나로 손쉽게 처리가능하다.사용된 디스크 공간을 온전히 반환가능하다.자원 사용 효율 증가 및 쿼리 성능 향상e.g) 계시판과 같이 최근에 저장된 데이터들을 위주로 조회하는 경우날짜 범위로 파티셔닝 하여 각..

21) Join Update & Join Delete

Use Case다른 테이블의 컬럼 값을 참조해서 Update / Delete 하고 싶은 경우한 번에 여러 테이블에 대해 Update / Delete 하고 싶은 경우 Join Update첫번째 쿼리특정 회사의 상품 수수료율이 변경되었을 때 그 회사의 제품들의 가격을 update하는 쿼리다른 테이블의 컬럼 값ㅇ르 참조해서 실제 작업 대상 테이블의 데이터를 업데이트하는 경우두번째 쿼리product, order table에 상품명을 저장하려고 한다.join후에 한번의 쿼리로 상품명을 update 하였다.SET 절에 update 대상 컬럼들을 명시한다.쿼리에서 참조하고 있는 테이블들 중 "전체" 또는 "일부"에 대해 컬럼 값 업데이트가 가능하다Left Join등 다른 유형의 join들도 사용이 가능하다.쿠폰 만료..

20) Dead Lock

Deadlock원인tx1 이 pk=2 레코드에 exclusive lock (x-lock)획득tx-2,3 이 중복된 레코드에 대해서 s-lock 이 필요해서 대기tx1 commit하면 tx2,3 shared lock 동시획득tx2,3 pk=2레코드에 대해서 동시에 x-lock 획득 대기의문 사항왜 shared lock을 먼저걸고 , exclusive lock을 걸어야 하는가?insert시에 pk는 unique해야함으로 해당 record에대해서 s lock을 걸고 확인을 먼저하게 된다.어떻게 이미 삭제된 레코드에 대해서 lock을 걸수 있는가?해당 레코드들을 영구적으로 삭제하지 않고 일정시간 동안 삭제표시만 상태로 유지한다. (Deletion-mark [Tomb stone])쿼리에서만 해당 레코드가 보이지 ..

19) JSON 타입 활용

JSON 데이터 타입JSON 형식의 데이터를 손쉽게 저장 및 조회 , 관리 가능빌트인 함수들을 사용해서 JSON 데이터 조작 가능저장된 JSON 데이터의 일부만 업데이트 가능( 부분 업데이트도 가능)저장된 JSON 데이터의 특정 키에 대해서 인덱스 생성 가능  default 가 null이 아니면 instant 알고리즘으로 DDL이 불가능하다.테이블 전체를 락을 잡게되는 algorithm = Copy를 사용해야한다. 이때는 DDL작업중에는 DML이 차단된다.  JSON 데이터 저장주의할점은 객체 데이터 입력시 key에 해당하는 값은 반드시 쌍따옴표로 감싸줘야 정상적으로 값이 들어간다.insert할시에 json 형식인지 validation이 존재한다. 저장 구조최적화된 바이너리 포맷으로 저장된다.중복된 키 ..