일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 개인정보보호위원회
- 동적타이핑
- 한국정보보호산업협회
- 개인정보안전성
- 모듈러 연산
- 백엔드입문
- 포너블
- 국가인적자원개발컨소시엄
- 개인정보보호
- 마감임박
- arrow function
- package.json
- 무료교육
- node.js
- function scope
- 가명정보처리
- 백엔드
- 한국정보보호산업협회기자단
- 한국산업인력공단
- 덧셈 암호
- 유클리드_알고리즘
- 웹 프레임워크
- Writeup
- 호이스팅
- package-lock.json
- 확장 유클리드 알고리즘
- 디오판투스 알고리즘
- pwnable.tw
- 곱셈 암호
- 개인정보보호교육
- Today
- Total
짱짱해커가 되고 싶은 나

파일 분석 start 파일을 실행해보면 다음과 같이 무언가를 입력받고 종료된다. file과 checksec로 봤을 때도 특별히 신경써야 하는 부분은 보이지 않는다. (nc 서버에는 ASLR 걸려있음ㅜ) not stripped이기 때문에 objdump로 어셈블리어를 우선 확인해본다. _start함수와 _exit함수가 있는 것을 확인할 수 있다. 여기서 int 명령어는 처음 보는 명령어였는데 int는 x86 CPU를 위한 어셈브리어로 인터럽트를 발생시킨다고 한다. 예를 들어 int 21h는 0x21(33)의 인터럽트를 생성하는데 이는 인터럽트 테이블의 34번째 벡터를 가리키고 이 함수를 실행시킨다. 여기서 int를 사용하는 부분을 보면 모두 0x80이다. 검색해보니 int 0x80은 시스템 콜을 의미한다고 ..

JavaScript : 객체 기반의 스크립트 프로그래밍 언어 - 인터프리터 언어 : 한 번에 한 줄 씩 읽어들여 실행 ex) python, R const 상수_이름 let 변수_이름 var 변수_이름 (ES5까지는 var을 사용, 6부터는 const와 let 사용) 변수의 범위에는 블록 scope와 함수 scope가 있다. const와 let의 범위는 블록 scope이고 var는 함수 scope다. 다음과 같은 코드가 있을 때 let의 경우 범위가 블록이기 때문에 해당 범위 밖에서는 호출이 불가능하다. 따라서 블록 밖에서는 변수 b가 정의되어 있지 않다고 에러가 발생한다. 하지만 var는 함수 scope이기 때문에 사용할 수 있다. Hoisting(호이스팅) : 호이스팅은 ECMA 2015 전까지 사용된..

Node.js : 웹브라우저에서 쓰이는 자바스크립트를 서버에서도 사용 가능하게 만드는 것. (자바스크립트 문법을 서버에서 사용가능하도록 V8(프론트엔드에서 쓰이는 자바스크립트)를 서버에서도 사용할 수 있도록 for 대용량 서비스). Q. Node.js와 브라우저의 차이점 A. 제공하는 API와 엔진이 다르다. Node.js 브라우저 UI 관련 API x UI 관련 API o window, document 관련 API x window, document 관련 API o 컴퓨터 제어 API o 컴퓨터 제어 API x v8 다양한 엔진 사용 가능 프론트엔드 : javascript 백엔드 : javascript, PHP, java 등 백엔드에서 javscript를 사용하면 언어의 통일성 walmart, ebay,..

unsigned int random 에 rand()결과를 대입하고 unsgiend int key에 정수형으로 입력받는다. key ^ random == 0xdeadbeef가 되면 된다. 그런데 radn()함수를 쓰면 결과가 계속 중복되어 나온다. 그러므로 gdb를 이용해서 radn()의 결과를 알아보자. rax에 rand의 결과가 저장되어 있다. 그러므로 key = 0x6b8b4567 ^ 0xdeadbeef 이다.

welcome() 을 통해 name[100]에 100글자 이내로 scanf한다. login()을 통해 scanf("%d", passcode1)를 하고 입력 버퍼를 fflush를 이용해 비운 뒤 scanf("%d", passcode2)를 한다. &passcode1인 passcode1을 하는 것을 확인 할 수있다. 즉, passcode1 변수의 위치 안에 저장하지 못하고 변수의 위치 자체를 바꾸는 것이다. 그렇다면 passcode1에 @got에 system("\bin\cat flag")의 위치를 넣으면 되지 않을까? gdb를 해보자 welcome()함수를 보면 name 배열의 위치가 ebp-0x70인 것을 확인할 수 있다. login()함수를 보면 passcode1의 위치는 ebp-0x10, passcode..

malloc()을 한뒤 그곳에 flag를 복사해 놓았다고 한다. 처음에 loc_44A770을 call하는데 이곳에서 flag를 pop하는 것을 볼 수 있었다. 그런데 analysis failed가 계속 나타났다. 항상 포너블 문제를 풀때 바이너리 파일에 관해 checksec로 보안기법이 걸려있는지 확인하고 시작하자. flag는 UPX로 패킹되어 있다. 패킹 : 실행 파일 압축과 암호화 효과를 위해 사용 + 악성코드를 안티바이러스, 소프트웨어로부터 숨길 수 있고, PE 파일의 내부 코드와 소스 분석을 어렵게 하며 악성코드의 크기를 줄일 수 있다. UPX(the Ultimate Packer for eXecutables) : 여러 OS에서 수많은 파일 포멧을 지원하는 실행 파일 압축 프로그램 - 패킹/언패킹 ..

이번 문제는 앞선 문제와 달리 nc로 접근한다. ssh : 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일 복사 nc : netcat은 TCP/UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를 읽고 쓰는 간단한 유틸리티 프로그램. cat이 파일에 쓰거나 읽듯이 nc는 network connection에 읽거나 쓴다. 즉, ssh는 직접 그 원격 시스템에 로그인해서 시스템 안에 들어가서 명령어를 실행 할 수 있는 것이고 nc는 cat을 이용해서 network connection에 읽거나 쓰는 것이다. 그리고 문제 코드의 주소가 있는데 wget 명령어를 통해 다운받을 수 있다. main함수는 func(0xdeadbeef)를 한다. func()함수를 보면 ov..

col.c 코드를 분석해보면 main의 첫번째 조건문에서 argc는 2이상이어야 한다. 즉, 하나이상의 argv를 입력하면 된다. 기본적으로 argc=1로 path가 들어가기 때문이다. 2번째 조건문에서는 argv[1]의 길이가 20이어야 함을 알 수 있다. 3번째 조건문에서는 argv[1]을 check_password함수에 넣었을 때의 결과가 hashcode와 같으면 flag를 cat할 수 있다. check_password함수를 보면 argv의 배열을 5부분으로 더해서 return하는 것을 확인 할 수 있다. hashcode 를 5로 나누면 113626824*4 + 113626828이 된다. 그런데 총 길이가 20이어야 하므로 hex로 변환하면 0x06c5cecc *1 + 0x06c5cec8 *4 가 ..