분류 전체보기
제2회 KISIA 정보보호해커톤 후기
작년에 AI개발보안교육, S개발자 참여자 대상으로 진행했던 제1회 해커톤에 KISIA 기자단으로 기사 작성차 방문했던 적이 있었다. 단체 후드티를 입고 개발하던 모습이 상당히 인상적이었는데, 올해는 전국 대학생을 대상으로 행사가 열렸다. 기획 일정이랑 해외여행 일정이 겹치고 개발 역량도 부족했기에 그냥 하고 싶었던 공부나 해야겠다 싶어 신경끄고 있었는데, 다른 프로그램에서 알게 된 분이 혹시 함께하지 않겠냐 해서 혹해버렸다. 결국 참여하게 되었다. 팀원도 구하는 중이었고 주제, 기획서까지 촉박하게 정해야 했는데, 팀원은 나를 데려온 팀장님께서 대학 후배들을 데리고 진행하게 되었다. 여러 주제가 있었는데 처음 팀장님이 생각했던 주제로 진행했다. 내가 맡게 된 역할은 전혀 해보지 않았던 분야라 애를 먹었는데..
ubuntu에서 LLVM 기본 버전 바꾸는 방법
bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"우분투에서 최신 LLVM 버전을 설치하는 방법은 다음과 같다. 하지만 최신 버전을 설치해도 clang --version으로 확인해보면 기본적으로 설치된 clang의 버전만 나왔다. 나의 경우 LLVM과 clang 18이 설치되어 있는데도 불구하고 clang은 14로만 동작했다. 이런 문제를 해결하려면 터미널에서 다음과 같이 입력하면 된다.fuzz@fuzz:~$ sudo suroot@fuzz:~5# ^Croot@fuzz:~# cd /usr/lib/llvm-18/binroot@fuzz:/usr/lib/llvm-18/bin# for f in *; do rm -f /usr/bin/$f; ln -s ../lib/llvm-..
libAFL 개념 정리
libAFL 소개libAFL의 등장 배경AFL++, libFuzzer, Honggfuzz 등 주요하게 사용되는 퍼저가 존재하지만, 이들은 확장성 있게 설게되지 않았다. 퍼저 개발자는 이러한 기존 도구 중 하나를 포크하거나 처음부터 새로운 퍼저를 만들어야 한다. 어떤 경우든 연구자들은 서로 호환되지 않는 수많은 퍼저를 개발하게 되고, 퍼저의 뛰어난 기능을 새로운 프로젝트에 결합할 수도 없다.이런 갈라파고스화 문제를 해결하기 위해서, AFL++ 개발자들이 만든 퍼저 개발용 라이브러리가 libAFL이다. libAFL의 특징Rust 컴파일러가 동작하는 어떤 플랫폼에서도 사용할 수 있다.AFL++ 개발자들이 제작한 것으로, 최신 퍼징 트렌드를 반영했다.LLMP(저수준 메시지 전달)을 개발해 코어에 따라 기능을 선..
[Rust] 스레드
스레드 이용하기spawn으로 새로운 스레드 생성새로운 스레드를 생성하려면 thread::spawn 함수를 호출하고, 스레드에서 실행하고 싶은 코드가 담긴 클로저를 넘긴다.use std::thread;use std::time::Duration;fn main() { thread::spawn(|| { for i in 1..10 { println!("hi number {} from the spawned thread!", i); thread::sleep(Duration::from_millis(1)); } }); for i in 1..5 { println!("hi number {} from the main thread!",..
[Rust] 스마트 포인터
러스트는 소유권과 대여의 개념을 가지고 있다. 참조자는 데이터를 빌리기만 하는 반면, 스마트 포인터는 가리킨 데이터를 소유한다.Box가장 직관적인 스마트 포인터로, 힙에 데이터를 저장할 수 있게 해준다.fn main() { let b = Box::new(5); println!("b = {}", b);}위와 같이 사용하면 b는 일반적인 코드와 똑같이 5라는 값을 나타낼 것이다. 5가 힙에 할당된다는 점만 다르다.재귀적 타입recursive type은 자기 안에 동일한 타입의 또 다른 값을 담을 수 있다. 컴파일할 때 모든 정보를 알아야 하는 러스트에 있어서 재귀적 타입은 문제를 일으킬 여지가 많다. 박스는 알려진 크기를 갖고 있으므로 박스에 넣으면 이를 허용할 수 있다. 콘스 리스트(cons l..
[Rust] 반복자
반복자반복자는 일련의 아이템을 순서대로 처리할 수 있게 해준다. let v1 = vec![1, 2, 3]; let v1_iter = v1.iter(); for val in v1_iter { println!("Got: {}", val); }반복자를 사용해 for 루프가 호출되면, 반복자의 각 요소가 루프의 한 순번마다 사용된다.Iterator 트레이트모든 반복자는 표준 라이브러리의 Iterator 트레이트를 구현한다.pub trait Iterator { type Item; fn next(&mut self) -> Option;}type Item 과 Self::Item 은 이 트레이트의 연관 타입을 정의한다. 트레이트를 구현하려면 Item 타입도 함께 정의되어야 하..
[Rust] 클로저
러스트는 함수형 언어에 영향을 받아 만들어졌다. 그래서 반복자와 클로저라는 특성을 갖고 있다.클로저클로저는 변수에 저장하거나 다른 함수에 인수로 전달할 수 있는 익명 함수이다. 클로저를 만들고 다른 곳에서 클로저를 호출해 평가할 수 있다. 클로저는 정의된 스코프에서 값을 캡처할 수 있다.클로저로 환경 캡처하기티셔츠 회사에서 메일링 리스트에 있는 사람들에게 한정 티셔츠를 주는 이벤트를 한다. 사람들은 좋아하는 색상을 설정해두면 해당 색상의 티셔츠를 받을 수 있고, 설정을 안 했다면 회사가 가장 많이 보유 중인 색상을 받는다.#[derive(Debug, PartialEq, Copy, Clone)]enum ShirtColor { Red, Blue,}struct Inventory { shirts..
[Rust] 테스트
러스트에서는 함수의 동작을 테스트할 수 있는 문법을 제공한다. 테스트는 cargo test로 실행할 수 있고, 이 명령을 실행하면 테스트 실행 바이너리를 빌드한다.테스트 작성src/lib.rs#[cfg(test]mod tests{ #[test] //이 함수가 테스트 함수임을 명시 fn it_works() { let result = 2 + 2; assert_eq!(result, 4); //result의 값은 4와 같을 것 }}#[test]로 이 함수가 테스트 함수임을 명시한다. assert_eq! 매크로는 ‘result의 값이 4와 같을 것’이라고 단언(assert)한다. cargo test 로 실행하면 test result: ok. 라는 프롬프트가 뜬다.a..