[Dreamhack] 현대 암호 # 서론 대칭키 암호 시스템(Symmetric Key Cryptosystem): 송신자와 수신자가 같은 키를 공유해야하는 암호 시스템 ex) 카이사르 암호, 비제네르 암호 같은 키를 갖고 있어야 하는 특성상, 대칭키 암호 시스템은 사전에 서로 키를 공유하는 과정이 반드시 필요하다. 키 공유 알고리즘(Key-sharing Algorithm): 외부인이 키가 공유되는 과정을 도청해도, 공유되는 키는 알지 못하게 하는 방법 현대에 많은 데이터가 오가는 네트워크는 도청에 취약하므로 키를 평문으로 공유하기에 부적절하기에 시작된 연구이다. Diffie와 Hellman이 Diffie-Hellman 키 교환 알고리즘 제시 송신자와 수신자가 서로 다른 키를 사용하는 공개키 암호 시스템의 ..
[Dreamhack] file-download-1 File Download 취약점이 존재하는 웹 서비스입니다. flag.py를 다운로드 받으면 플래그를 획득할 수 있습니다. # 접속 - Home Navigation Bar에 Home과 Upload My Memo가 링크로 걸려있음을 확인할 수 있음 메모를 추가할 경우 Home에서 바로 확인이 가능한 형태이며 해당 메모를 클릭하면 내용을 볼 수 있음 - upload 파일의 이름과 내용을 작성하여 메모를 추가할 수 있는 페이지 - read upload했던 메모를 확인할 수 있음 url을 확인했을 시 get parameter로 파일 이름을 이용하고 있음 # 코드 확인 - app.py 파일을 upload하는 부분에서는 find 함수를 통해 ".."을 필터링하고 있..
[Dreamhack] Cryptography Introduction # 암호학 좁은 의미에서 제 삼자로부터 정보를 보호하는 방법에 대한 연구이다. 핵심 연구 주제: 키 생성(Key Generation), 암호화(Encryption), 복호화(Decryption) 키 생성: 암호화 및 복호화에 사용할 키를 만드는 과정이다. 암호화: 키를 이용해 평문(Plaintext)을 암호문(Ciphertext)으로 변환하는 과정이다. 복호화: 송신자가 암호문을 전송하면 수신자는 키를 이용해 암호문을 평문으로 복호화한다. 암호 시스템(Cryptosystem): 암호화와 복호화로 정보가 전달되는 체계이다. 💡 암호화와 인코딩 인코딩(Encoding): 암호화와 유사하게 데이터를 다른 형태로 변환하는 것이다. 데이터의 기밀..
basic_rop_x86 이 문제는 서버에서 작동하고 있는 서비스(basic_rop_x86)의 바이너리와 소스 코드가 주어집니다. Return Oriented Programming 공격 기법을 통해 셸을 획득한 후, “flag” 파일을 읽으세요. “flag” 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다. 플래그의 형식은 DH{…} 입니다. # 문제 분석 - 소스 코드 main 함수에서 read 함수와 write 함수를 사용함 initialize 함수에서 puts 함수를 사용함 → 인자를 하나만 필요로 하기 때문에 이를 활용하여 페이로드를 작성하면 좋을 것 데이터를 읽어들일 수 있는 함수는 read 함수이며, 이를 통해 system 함수의 주소를 구하게 된다면 이미 ROP 페이로드가 ..
basic_rop_x64 이 문제는 서버에서 작동하고 있는 서비스(basic_rop_x64)의 바이너리와 소스 코드가 주어집니다. Return Oriented Programming 공격 기법을 통해 셸을 획득한 후, “flag” 파일을 읽으세요. “flag” 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다. 플래그의 형식은 DH{…} 입니다. # 문제 분석 - 소스 코드 main 함수에서 read 함수와 write 함수를 사용함 둘 중 하나의 GOT를 읽어 libc.so.6가 매핑된 영역의 주소를 구하고, 이를 통해 system 함수의 주소를 얻을 수 있을 것 데이터를 읽어들일 수 있는 함수는 read 함수이며 이를 통해 system 함수의 주소를 구하게 된다면 이미 ROP 페이로드가 ..
out_of_bound 이 문제는 서버에서 작동하고 있는 서비스(out_of_bound)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득하세요. “flag” 파일을 읽어 워게임 사이트에 인증하면 점수를 획득할 수 있습니다. 플래그의 형식은 DH{…} 입니다. # 문제 분석 - 소스 코드 command에 접근하는 idx에 대한 검증이 없으므로 oob 가능 system 함수는 const char * 인수가 필요하므로 name 배열에서 0번째 인덱스부터 3번째 인덱스까지 "cat flag" 문자열을 저장하고 있는 곳의 주소를 저장한다면 해당 주소를 따라가 system("cat flag")가 출력될 것임 따라서 name[4] 위치부터 "cat flag" 문자열을 저장하고 그..
Background: PIE # 들어가며 ASLR이 적용되면 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등이 무작위 주소에 매핑되므로, 공격자가 이 영역들을 공격에 활용하기 어려워짐 PIE: ASLR이 코드 영역에도 적용되게 해주는 기술 해당 기술은 보안성 향상을 위해 도입된 것이 아니기 때문에 엄밀하게 보호 기법은 아니나 이를 보호 기법이라고 소개하는 글이나 발표도 있음 Figure 1. PIE가 적용되지 않은 addr의 실행 결과 # PIC와 PIE - PIC 리눅스에서 ELF는 실행 파일(Executable)과 공유 오브젝트(Shared Object, SO)로 두 가지가 존재 실행 파일은 addr 바이너리처럼 일반적인 실행 파일이 해당하고, 공유 오브젝트는 libc.so와 같은 라이브러리..
Background: RELRO # 서론 Lazy Binding: 함수가 처음 호출 될 때 함수의 주소를 구하고, 이를 GOT에 적는 것 Lazy Binding을 하는 바이너리는 실행 중에 GOT 테이블을 업데이트할 수 있어먀 하므로 GOT에 쓰기 권한이 부여됨 → 바이너리를 취약하게 만드는 원인 ELF의 데이터 세그먼트에는 프로세스의 초기화 및 종료와 관련된 .init_arrary, .fini_array가 있음 해당 영역들은 프로세스의 시작과 종료에 실행할 함수들의 주소를 저장하고 있음 여기에 공격자가 임의로 값을 쓸 수 있다면, 프로세스의 실행 흐름이 조작될 수 있음 이러한 문제를 해결하고자 프로세스의 데이터 세그먼트를 보호하는 RELocation Read-Only(RELRO)가 개발됨 RELRO는 ..
rop Exploit Tech: Return Oriented Programming에서 실습하는 문제입니다. # 문제 분석 - ROP (Return Oriented Programming) 리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는 기법 ROP 페이로드는 리턴 가젯으로 구성되며, ret 단위로 여러 코드가 연쇄적으로 실행되는 모습에서 ROP Chain이라고도 불림 - 소스코드 저번 문제와 달리 system 함수를 호출하지 않아 PLT에 등록되지 않으며 "/bin/sh" 문자열도 데이터 섹션에 기록되지 않음 따라서 system 함수를 익스플로잇에 사용하기 위해서는 함수의 주소를 직접 구해야하고 "/bin/sh" 문자열을 사용할 다른 방법을 고민해보아야 함 // Name: rop.c // Compile:..
ssp_001 이 문제는 작동하고 있는 서비스(ssp_001)의 바이너리와 소스코드가 주어집니다. 프로그램의 취약점을 찾고 SSP 방어 기법을 우회하여 익스플로잇해 셸을 획득한 후, “flag” 파일을 읽으세요. “flag” 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다. 플래그의 형식은 DH{…} 입니다. # 문제 분석 - checksec 확인 32bit 환경 canary 존재 NX enabled 이므로 스택 내 실행 권한 X - 소스코드 옵션 선택 F: box 배열에 내용을 입력할 수 있으며 이때 bof는 발생하지 않음 P: box 배열 내의 원소를 index로 접근할 수 있으며 이때 index에 대한 검증 과정이 없기 때문에 oob read 가능 E: name 배열에 내용을 입력..