분류 전체보기

    [Rust] 오류 처리

    러스트에는 복구 가능한(recoverable) 에러와 복구 불가능한 (unrecoverable) 에러가 있다. recoverable 에러는 Result 타입으로, unrecoverable 에러는 panic! 매크로로 처리한다.panic!코드가 실행되고 문제가 발생했지만 딱히 할 수 있는 일은 없을 수도 있다. 이런 panic 상황이 발생하면 실패 메시지를 출력하고, 되감고(unwind), 스택을 청소하고 종료한다. panic! 매크로를 사용하면 즉시 panic을 발생시킨다.fn main() { panic!("crash!");}//thread 'main' panicked at crashfn main() { let v = vec![1, 2, 3]; v[99];}벡터 크기보다 큰 인덱스에 접근..

    [Rust] 컬렉션

    컬렉션(collection)은 표준 라이브러리에 포함된 데이터 구조로, 벡터, 문자열과 같이 다수의 값을 담을 수 있으며, 힙에 저장되어 동적으로 할당된다.벡터같은 타입의 값만을 저장하는 구조이다.let v: Vec = Vec::new();let v = vec![1, 2, 3]; 벡터는 제네릭을 이용하여 구현되었다. 따라서 어떤 타입의 값을 저장할 것인지를 angle bracket ‘’으로 감싸서 명시했다(type annotation).초깃값을 함께 지정하는 경우 러스트에서 타입을 유추할 수 있으므로 생략할 수 있다. 이 때는 매크로 vec! 을 사용한다.벡터 활용let mut v = Vec::new();v.push(5);v.push(6);let first = &v[0];let second: Option..

    [Rust]프로젝트 모듈 관리

    패키지와 크레이트크레이트(crate)가장 작은 코드 단위이다. 바이너리 크레이트는 실행파일로 컴파일할 수 있는 프로그램이다. main 함수를 포함해야 한다.라이브러리 크레이트는 여러 프로젝트에서 공용될 의도로 만들어진 기능들이 정의되어 있는 크레이트이다. 일반적으로 ‘크레이트’라고 하면 라이브러리 크레이트를 말한다. 즉, ‘크레이트’라는 개념은 다른 언어에서의 ‘라이브러리’라고 볼 수 있다.크레이트 루트 (crate root)는 러스트 컴파일러가 컴파일을 시작하는 소스 파일이고, 크레이트의 루트 모듈을 구성한다.패키지(package)패키지는 여러 크레이트의 번들이다. 크레이트를 빌드하는 법이 설명된 Cargo.toml 파일을 포함한다. 패키지에는 여러 바이너리 크레이트가 포함될 수 있고, 라이브러리 크레..

    [Rust] 열거형

    열거형 정의열거형은 하나의 타입이 가질 수 있는 배리언트(variant)를 열거해 타입을 정의할 수 있도록 한다. 어떤 값이 여러 개의 가능한 값의 집합 중 하나라는 것을 나타낸다.IP주소는 ipv4, ipv6 두 가지 표준으로만 사용되므로, 열거형으로 모든 배리언트를 열거할 수 있다.enum IpAddrKind { V4, V6,}let four = IpAddrKind::V4;let six = IpAddrKind::V6;열거형을 정의할 때 식별자로 네임스페이스가 만들어지므로 각 배리언트 앞에 :: 을 붙여야 한다.enum IpAddr { V4(String), V6(String),}let home = IpAddr::V4(String::from("127.0.0.1"));let loopb..

    [Rust] 구조체

    구조체 정의와 인스턴스구조체를 정의하려면 struct 키워드와 구조체에 지어줄 이름을 입력한다.필드에는 각 구성 요소의 이름과 타입을 정의한다. struct User { active: bool, username: String, email: String, sign_in_count: u64,}fn main() { let mut user1 = User { active: true, username: String::from("someusername123"), email: String::from("someone@example.com"), sign_in_count: 1, }; user1.email = String::from("a..

    [Rust] 소유권

    소유권러스트가 메모리를 관리하는 방식이다.각각의 값은 소유자(owner)가 정해져 있다.한 값의 소유자는 동시에 여럿 존재할 수 없다.소유자가 스코프 밖으로 벗어날 때 값은 버려진다(dropped).String 타입쌍따옴표로 감싸 만든 문자열 리터럴은 immutable이라 변경할 수 없다. 따라서 String 타입이 존재한다. 힙에 할당된 데이터로 컴파일 타임에 크기를 알 수 없는 텍스트도 저장할 수 있다.let s = String::from("hello");위 코드는 String 타입에 있는 from 함수를 네임스페이스 연산자(:: )를 사용해 지정했다. 힙에 메모리를 할당했으므로 변경할 수 있다. 메모리를 할당했으면 해제도 해야 한다. 러스트에서는 변수가 소속된 스코프를 벗어나는 순간 메모리가 해제된..

    [Rust] 변수, 함수, 조건문, 반복문

    변수와 가변성러스트에서 변수는 기본적으로 immutable이다. 코드를 읽고 쓸 때 값이 어디서 바뀔지 추적할 필요가 없도록 하기 위함이다. 변수를 가변으로 만들려면 앞에 mut 을 붙이면 된다.fn main() { let mut x = 5; println!("The value of x is: {x}"); x = 6; println!("The value of x is: {x}");상수상수는 항상 불변이므로 mut 를 사용할 수 없다. let 대신 const를 사용한다. 관례적으로 단어 사이에 밑줄을 사용하고 모든 글자를 대문자로 쓴다. const HOURS_IN_SECONDS: u32 = 60 * 60;섀도잉새 변수를 이전 변수명과 같은 이름으로 선언할 수 있다. 이 때 첫 번째 ..

    [번역] A Look at AFL++ Under The Hood

    https://blog.ritsec.club/posts/afl-under-hood/ AFL++의 동작 과정을 자세히 분석한 위 글을 DeepL을 이용해 번역한 내용입니다. 일부 source, '여기'에 해당하는 링크는 누락되었을 수 있습니다. AFL++와 Coverage-Based Fuzzing은 무엇입니까? AFL은 무작위 입력 퍼저가 아닙니다. AFL은 커버리지 기반 퍼징이라는 것을 수행합니다. 커버리지 기반 퍼징의 기본 개념은 바이너리에서 어떤 영역이 실행되고 있는지 또는 커버리지가 있는지 추적하는 것입니다. 이 정보를 추적함으로써 어떤 입력이 코드의 어떤 부분을 실행하는지 파악할 수 있습니다. 이를 통해 코드베이스의 작은 하위 집합뿐만 아니라 전체 코드베이스를 포괄하는 입력 데이터베이스를 개발할 ..