전체 글 122

[끄적거림] 오일러 함수 증명

서로소 a, n 서로소 a, n이 존재한다. n에 대해, 1 부터 n - 1까지의 수들 중 n과 서로소인 수들을 모은 집합을  R이라 하자.R = { r in N | gcd(r, n) = 1, 1  이 모든 r을 곱한 값을 Rk라 둔다.이제 이 집합 R에 모든 원소에 a를 곱한다.Ra = {ar1, ar2, ar3 ... ark}이때 Rk = Rk *  a^ϕ(n) mod n 이고 양변에 R를 나눠  a ^ ϕ(n) mod n = 1  이게 자명하려면  n과 서로소인 수 r의 집합의 모든 값의 곱과 Ra의 모든 원소의 곱이 같아야 한다.Lemma 1. Ra의 모든 원소의 mod n 은 다르다.  Ra = {ar1, ar2 ... ark} 에 대해어떤 수 ari, arj가 mod n에 대해 같은 값을 가진..

끄적거림 2025.03.26

[끄적거림] 왜 ϕ(ab)=ϕ(a)ϕ(b) 인가?

어떤 수 n이 소수일 때 ϕ(n)의 값이 n - 1임은 자명하다. a와 b가 소수 일때,  소수의 성질을 이용하여,  a는 1 ~ a - 1까지 모든 수에 대해 서로소이다. 그래서  ϕ(a) = a - 1임이 자명하다. b도 마찬가지다. 왜 ϕ(a * b) = ϕ(a) * ϕ(b) 인가?  n = a * b라 두자. 즉 n는 두 소수의 곱이다. ϕ(n)에 대해  X = { x∈Z ∣ 1 ≤ x ab, gcd(x, n)=1} 을 만족하는 집합 X가 있다 치자. 즉 X는, 1 ~ n - 1까지 n과  서로소인 수의 집합이다. 조합적 관점에서  각 i ∈ {1,...,a−1},  j ∈ {1,...,b−1} 를 만족하는 i와 j를 고르는 것. 그렇다면 i와 j는 X에 대해 무슨 의미를 가지는 가?x mod a..

끄적거림 2025.03.26

[DreamHack] command-injection-1

문제 링크  https://dreamhack.io/wargame/challenges/44 command-injection-1특정 Host에 ping 패킷을 보내는 서비스입니다. Command Injection을 통해 플래그를 획득하세요. 플래그는 flag.py에 있습니다. Reference Exercise: Command Injectiondreamhack.io 문제 해법 커맨드 인젝션을 이용한 exploit을 통해,  서버 내부 명령어를 실행토록 하는 공격입니다. ping 루트 @APP.route('/ping', methods=['GET', 'POST'])def ping(): if request.method == 'POST': host = request.form.get('host') ..

Hack/DreamHack 2025.03.12

[DreamHack] file-download-1

문제 링크  https://dreamhack.io/wargame/challenges/37 file-download-1File Download 취약점이 존재하는 웹 서비스입니다. flag.py를 다운로드 받으면 플래그를 획득할 수 있습니다. Reference Introduction of Webhackingdreamhack.io 문제 설명  파이썬 코드로 쓰인 Flask로 구동되는 웹 서버 내부에서 flag를 찾는  문제입니다.  문제 파일을 받으시면, 다음과 같은 구조가 나옵니다. app이 이제 구동되는 웹 서버 코드입니다. 크게 3가지 경로가 존재합니다. 루트 경로 / 경로: 업로드된 파일 목록을 가져와 index.html 템플릿에 전달하고, 이를 렌더링하여 사용자에게 파일 목록을 보여줍니다. @APP...

Hack/DreamHack 2025.03.12

[DreamHack] cookie

문제 링크 https://dreamhack.io/wargame/challenges/6 cookie쿠키로 인증 상태를 관리하는 간단한 로그인 서비스입니다. admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다. 플래그 형식은 DH{...} 입니다. Reference Introduction of Webhackingdreamhack.io 문제 목적 컴퓨터 보안 수업을 듣고 있습니다. CTF를 과제로 내주신다길래, 처음 듣는 문제라, 연습이 필요할 것 같아 CTF를  연습할 수 있는 해킹 연습 사이트에서 공부하려 합니다.   문제 환경 설정 이 해킹 연습 사이트는, 가상 VM 머신을 구동해주는 것 같습니다.  해당 VM 머신 구동 소스 코드는 다음의 문제 파일 받기에서 다운 받을 수 있는 파일과 같..

Hack/DreamHack 2025.03.11

[Rust] ToolChain Nightly

Stable한 Rust Rust라는 프로그래밍 언어는, 기존 Unsafe 언어들의 불안전함을 보완하는 언어입니다. 이를 위해, 컴파일 타임에 정적으로 메모리 안전을 보장합니다. 이 "메모리 안전 보장"을 위해, 수명, 소유권과 같은 Rust 내 자체적인 엄격한 보안 Principle들을 수반합니다. 이러한 보안 원리들 중 또 다른 하나는, Raw pointer의 직접적인 사용을 방지하는 것 입니다. 기존의 C/C++은 메모리에 특정 주소에 직접 접근이 가능했습니다. Rust는 이러한 Raw pointer의 사용을 금지합니다. 그러나 여전히 시스템 프로그래밍과 같은 저수준의 메모리 접근이 필연적입니다. Rust는, 이를 위해 Unsafe 영역을 제공합니다. 어쨌든, 이런 Unsafe 영역을 제외한 다른 함..

[Rust] Closures

Closure란? Closure는 함수처럼 동작하지만 주변의 변수들을 캡처할 수 있는 특징이 있습니다.  Rust에서 클로저는 주로 짧고 간단한 작업을 수행할 때 유용하게 사용됩니다. 즉, inline 함수처럼 짧게 사용하되, 현재 environment에서 변수들을  불러올 수 있다는 특징이 있습니다. 문법 두 가지로 나뉩니다. 먼저 가장 명시적으로 closure를 정의하는 방법입니다. let closure_annotated = |i: i32| -> i32 { i + outer_var }; closure에 사용될 인자들은 | | 사이에 전달합니다. 그리고 어떤 값을 return 할지, 어떤 동작을 할지 함수처럼 정의합니다. 이때 outer_var은 현재 범위에 정의된 변수여야 합니다. 또는, clo..

[Rust] Rust Functions

프로그래밍 언어에서의 함수란? 함수는 프로그래밍에서 특정 작업을 수행하는 코드 블록으로,  1. 재사용 가능하고  2. 모듈화 된 단위입니다. 3. 함수를 사용하면 코드의 가독성과 유지보수성이 높아지고,  4. 중복 코드를 줄일 수 있어 효율적입니다. 당연히 Rust에서도 함수를 구현할 수 있는 문법을 제공합니다. C, C++의 함수  int add(int a, int b){ ..} C, C++에서 "add" 라는 함수를 정의하면 위와 같이 정의합니다. 이때 이 "add" 라는 함수의 행동을 정의하고 싶다면 { } 사이에 원하는 구문을 삽입합니다. 예를 들어  return a + b; 와 같은 구문을 넣을 수 있을 겁니다. 이때, return 하고자 하는 값의 type을 함수 이름 앞에,  함수의 연산에..

[Rust] 백준 알고리즘 2739번: 구구단

문제 링크  https://www.acmicpc.net/problem/2739 문제 해법  정수 N을 입력받아, N에 해당하는 구구단을 출력하면 됩니다. 해법 코드 use std::io::stdin;fn main() { let mut buf = String::new(); stdin().read_line(&mut buf).unwrap(); let N = buf.trim().parse::().unwrap(); for i in 1..10 { println!("{} * {} = {}", &N, &i, &N * &i); }} buf에 표준 입력을 받아 저장합니다. 이후 N을 정수로 변환한 뒤, 1부터 9까지 위와 같은 format으로 출력합니다.

알고리즘/[Rust] 2025.01.17

[Rust] 백준 알고리즘 9086번: 문자

문제 링크 https://www.acmicpc.net/problem/9086 문제 해법 먼저 정수 테스트 케이스 T를 입력받습니다. 이 개수만큼, 문자열을 입력받고,  문자열의 가장 첫 번째 문자와, 가장 마지막 문자를 공백없이 출력 후 이를 테스트 케이스 T의 크기만큼 반복합니다. Rust에서의 반복문 구현  파이썬의 반복문과 유사합니다. for문의 경우, 1부터 100까지 인덱싱으로 반복하고 싶다면, for i in 1..101 {} 이런 구조를 통해, 맨 마지막 수를 제외하고, 1부터 100까지 i에 값을 담고 반복합니다. 만약 마지막 수를 포함하고 싶다면   for i in 1..=100 { } 이런 식으로 등호를 포함하면, 마지막 정수를 포함하여 반복합니다.   Rust에서의 문자열 ..

알고리즘/[Rust] 2025.01.17