목록Hack/DreamHack(로드맵) (94)
CIDY

*DES Data Encryption Standard는 미국 국가 안보국에서 IBM의 루시퍼 알고리즘을 개량해 만든 대칭키 암호이다. 128비트의 루시퍼와 달리 56비트이다. 현대에는 DES에 대한 공격 기법이 많이 연구되어 더 이상 블록 암호의 표준으로 쓰이지 않는다. 8바이트(== 64비트)를 한 블록으로 하는 블록 암호로, 초기 순열(IP), 페이스텔 구조의 16라운드, 최종 순열(FP), 그리고 각 라운드에서 사용되는 48비트의 키를 생성하는 키 생성 함수로 구성된다. *곱 암호 DES는 혼돈 성질 만족을 위해 치환을, 확산 성질 만족을 위해 순열을 사용한다. -> 치환과 순열을 여러번 교차해 반복 적용하면 혼돈과 확산의 성질을 모두 만족하게 될 수 있다. 이러한 특성을 이용해 한 라운드를 치환과..

AES는 전세계에서 암호 알고리즘을 공모받고, 심사를 거쳐 개중 가장 뛰어난 것이 선정된 결과이며, Rijndael구조가 채택되었고, 표준으로 선정된 이후부터 지금까지 기밀성을 위협하는 치명적인 취약점이 발견되지 않았다. CPU제조사들이 AES연산을 위한 명령어를 따로 정의해 줘서 암/복호화 성능도 뛰어나다. -> 현대에는 대칭키 암호 알고리즘을 사용할 때 일반적으로 AES가 사용됨. *SPN AES는 SPN(Substitution Permutation Network)라는 암호 구조를 사용한다. SPN은 곱 암호의 일종인데, S-Box를 사용하는 치환(Substitution)과, P-Box를 사용하는 순열(Permutation)을 여러 라운드에 걸쳐 반복한다. 페이스텔 구조(DES)와 달리 SPN구조의 ..

고전 암호 -> 송수신자 모두가 같은 키를 가지고 있어야 했음 -> 이러한 암호 시스템을 대칭키 암호 시스템이라고 함. https://orcinus-orca.tistory.com/97 [Cryptography] stage2: 고전 암호 *고전 암호 고성능 연산 장치 발명 이전, 간단한 기계와 손으로 암호화/복호화 하던 암호를 말한다. 고전 암호는 치환 & 전치의 방법으로 설계된다. 치환: 평문 -> 다른 문자, 전치: 평문 문자 위치 orcinus-orca.tistory.com 대칭키 암호 시스템의 경우 키를 공유하는 과정이 필수적 -> 네트워크상에서 평문 키를 공유하는 것은 부적절 -> 키 공유 과정을 알아도 키는 알지 못하도록 하는 키 공유 알고리즘 연구됨 Diffie-Hellman 키 교환 알고리즘..

*고전 암호 고성능 연산 장치 발명 이전, 간단한 기계와 손으로 암호화/복호화 하던 암호를 말한다. 고전 암호는 치환 & 전치의 방법으로 설계된다. 치환: 평문 -> 다른 문자, 전치: 평문 문자 위치 바꿈 단순한 고전 암호는 둘 중 하나의 원리만을 사용하고(치환 암호, 전치 암호), 복잡한 고전 암호의 경우 두 원리를 모두 이용한다. 치환 암호는 다시 단일 문자 치환 암호/ 다중 문자 치환 암호로 나뉜다. *단일 문자 치환 암호 평문의 각 문자를 약속된 다른 문자로 치환하는 암호. -> ex: 카이사르 암호 카이사르 암호는 평문의 각 알파벳을 일정 거리만큼 밀어서 다른 알파벳으로 치환하는 암호이다. 복호화 시에는 다시 원래 위치로 밀면 됨. -> 송수신자 간 몇 칸을 밀 것인지에 대한 사전 합의 필요 ..
*배타적 논리합 XOR연산을 생각하면 된다. 입력으로 들어온 두 인자가 다르면 참을 반환하는 연산이다. -> 암호학에서 배타적 논리합은 보통 비트 단위로 이루어진다. 자기 자신과의 배타적 논리합 결과는 0이다. *합동식 mod연산이라고 생각하면 된다. 정수 a, b, m에 대해 a와 b를 m으로 나눈 나머지가 같으면 -> a와 b는 mod m에 대해 합동이라고 한다. (congruent) 합동식의 경우 양 변에 덧/뺼셈 및 곱셈이 가능하지만, 나눗셈의 경우 일반적으로 성립하지 않으며, 양 변에 나눌 숫자와 정수 m의 gcd가 1인 경우에만 가능하다. *역원 정수 a, b, m에 대해 a * b = 1 (mod m)일때, b를 mod m에 대한 a의 (곱의)역원이라고 한다. (a ^ (-1)) 역원은 a와..
*프로그램 == 바이너리 연산 장치가 수행해야 하는 동작을 정의한 문서이다. 연산 장치에 프로그램 전달 -> CPU가 적혀있는 명령어들을 처리해 프로그래머가 의도한 동작을 수행함 사용자가 정의한 프로그램을 해석해 명령어를 처리할 수 있는 연산 장치를 programmable하다고 함. (컴퓨터 등) 프로그램이 저장 장치에서 이진 형태로 저장되기에 바이너리(Binary)라고도 한다. *컴파일러&인터프리터 CPU가 수행할 명령들을 프로그래밍 언어로 작성한 것을 소스코드라고 한다. 소스코드 -> (컴파일 by.compiler) -> 기계어 // 이렇게 컴퓨터가 이해할 수 있도록 기계어로 번역하는 소프트웨어를 컴파일러라고 한다. (gcc, clang, MSVC등) 컴파일러로 한 번 컴파일해두면 프로그램으로 계속 ..

파일 관련 함수가 호출될 땐 전달된 파일 포인터의 vtable주소를 참조한다. 이를 이용해 쉘을 획득할 수 있음. 우선 _IO_validate_vtable에 대한 이해가 선행되어야 한다. static inline const struct _IO_jump_t * IO_validate_vtable (const struct _IO_jump_t *vtable) { /* Fast path: The vtable pointer is within the __libc_IO_vtables section. */ uintptr_t section_length = __stop___libc_IO_vtables - __start___libc_IO_vtables; const char *ptr = (const char *) vtable;..

파일 읽기 함수에는 fread, fgets같은 친구들이 있다. -> 라이브러리 내부에서 _IO_file_xsgetn함수를 호출함 _IO_size_t _IO_file_xsgetn (_IO_FILE *fp, void *data, _IO_size_t n) { _IO_size_t want, have; _IO_ssize_t count; _char *s = data; want = n; ... /* If we now want less than a buffer, underflow and repeat the copy. Otherwise, _IO_SYSREAD directly to the user buffer. */ if (fp->_IO_buf_base && want _IO_buf_end - ..