공수기본 857기 수료 및 후기
·
목표
나는 정보보호병이었지만 우연히 특수전사령부의 직할부대인 123정보통신단으로 가게 되었다. 특수전사령부에서는 공수훈련이라는 것을 받을 수 있는데 특전병 뿐만 아니라 특전사에 있는 모든 병사나 간부들은 공수훈련을 받을 수 있는 기회가 있었다. 나는 원래 이등병 때부터 공수훈련을 해보고 싶다고 생각했었지만, 기본체력(달리기, 팔굽혀펴기, 윗몸일으키기)이 모두 2급이 되어야 공수훈련을 받을 수 있는데 내가 너무 나태한 나머지 병장이 될 때까지 운동을 미루기만 했다. 결국 조기전역 2달 전이 되어서야 정신을 차렸다. 22년 5월 15일이 내 조기전역 날짜였고 공수훈련 입교는 22년 4월 22일. 전역 전 마지막 기회였다. 2월 말이 되어서야 마지막 기회라는 것을 인지하고 운동을 시작했다. 처음에는 팔굽 52개, ..
자바스크립트 함수
·
WEB/자바스크립트
함수 호이스팅(hoisting) 전역변수로 설정된 변수를 함수내부에서 다시 변수를 선언할 경우 함수가 실행될 때 그 변수는 초기화된다.? 예를 들어 var a = 10; function abc() { document.write("a의 값은 " + a + "입니다."); //a -> undefined값이 된다. var a = 20; //함수가 실행될 때 var a; 가 실행되는것과 다름없다. document.write("a의 값은 " + a + "입니다."); //a -> 20이 된다. } 아래의 경우는 정상적으로 작동한다. var a = 10; function abc() { document.write("a의 값은 " + a + "입니다."); //a -> 10이 된다. a = 20; //a를 다시 선언하..
정적분석 : PE파일 구조, 스택, 힙
·
리버싱/잡지식
https://learn.dreamhack.io/209#1 로그인 | Dreamhack dreamhack.io 공부는 이곳에서 했다. 이미 알고 있는 지식도 같이 정리했다. 전체적인 틀 PE HEADER와 PE BODY(SECTION)으로 구분되는데 세부적으로 살펴보면 PE HEADER PE HEADER -> IMAGE_DOS_HEADER MS-DOS Stub Program IMAGE_NT_HEADERS SECTION HEADER -> .text .data .rdata등 섹션에 대한 정보가 들어있다. PE BODY SECTION -> .text .data .rdata등 여러개의 섹션이있다. SECTION과 SECTION HEADER의 섹션의 개수는 같아야 한다. SECTION에 세부적으로 알아보자. .t..
dreamhack 리버싱 rev-basic-9번 분석과 코드
·
문제풀이/리버싱
정답은 7자리임. 키값 생성 알고리즘 eax -> 입력한 첫번째 값 1. xor eax, I_am_KEY {0x49, 0x5F, 0x61, 0x6D, 0x5F, 0x4B, 0x45, 0x59} 입력한 첫번째 값이면 I, 두번째 값이면 _, 세번째 값이면 a로 이 문자열로 xor 연산을 한다. 2. mov eax, [0x00007FF61D1D4020+rax] 0x00007FF61D1D4020 값이 들어가있음. 키를 생성할 때 참고하는 메모리 값 같음. RDX -> 생성된 키값의 주소가 들어가있음. 의문점 : 0x00007FF61D1D4020에 있는 데이터가 어느순간 바뀌어 있다. 어디서 바뀐건지 나중에 살펴봐야겠다. 키값이 RAX에 들어가고 키를 생성할 때 참고하는 랜덤 값(0x00007FF61D1D402..
test, cmp 그리고 분기문 jmp
·
리버싱/공부
cmp와 test는 operand를 비교한다는 점에서 같지만 비교하는 방식이 다르다. cmp operand1, operand2 operand1와 operand2를 빼기를 통해서 비교한다.(operand1에서 operand2를 뺀다.) 만약 값이 같다면 결과 값은 0이 되어 ZF(제로 플래그)가 1로 설정된다.(operand1의 값은 변하지 않는다.) test operand1, operand2 operand1와 operand2를 and 연산을 통해서 비교한다. 만약 결과값이 0이라면 ZF(제로 플래그)가 1로 설정된다.(operand1의 값은 변하지 않는다.) 두 명령어를 알아봤지만 확실하게 어떤 상황에 저 명령어들이 쓰이는지 알아보고 싶어서 더 자세히 찾아봤다. cmp 명령어는 두 값이 같은지 다른지 정..
dreamhack 리버싱 rev-basic-8번 코드
·
문제풀이/리버싱
#include int main() { int answer[32] = {0xAC, 0xF3, 0x0C, 0x25, 0xA3, 0x10, 0xB7, 0x25, 0x16, 0xC6, 0xB7, 0xBC, 0x07, 0x25, 0x02, 0xD5, 0xC6, 0x11, 0x07, 0xC5}; int answer_count = 0; // answer 배열의 count 변수 int ascii_count = 0; // ascii 코드의 count 변수 int correct_string = 0; // 정답 문자를 담을 변수 for(answer_count=0; answer[answer_count]!=NULL; answer_count++) { for(ascii_count=0; ascii_count
dreamhack 리버싱 rev-basic-7번 코드
·
문제풀이/리버싱
#include int rol(unsigned int number, int count) { for(; count!=0; count--) { if(number>=0x80) { number = number
어셈블리어 ROL, ROR을 C언어로 구현해보자
·
리버싱/공부
우선 어셈블리어 ROL과 ROR에 대해 알아보자. dreamhack basic 7번 문제를 풀면서 공부 ROR은 Rotate Right의 약자이고 ROL은 Rotate Left의 약자이다. 쉬프트 연산을 하면서 소거되는 비트의 값이 사라지지 않고 새로 생기는 비트에 복사된다. 말로 설명하면 어려우니 예를 들어보자. 예를 들어 AL에 0X85(1000 0101)가 들어있다고 가정 해보자. ROR AL, 1 -> 0x85를 2진수로 바꾸면 1000 0101 -> 1100 0001이 된다. 보다시피 오른쪽으로 비트가 밀리면서 소거될 1이 왼쪽으로 복사된다. ROR을 C언어로 구현해 보면(최하위 비트가 1일 때 최상위 비트에 1이 복사된다.) 홀수일 때 최하위 비트는 무조건 1이라는 점을 이용해서 만들어보자. ..
Goblebin
고블빈