-
[Experience] 2022 ERC Workshop 포스터 발표 후기
포스터 pdf 배경 지난 학기 KCC에 제출했던 논문을 바탕으로 ERC 워크숍에서 포스터 발표를 할 수 있는 기회가 생겼다. 2저자로 참여한 논문이지만 이번 포스터 제작과 발표는 내가 주도적으로 맡게 되었다. 제주에서 열린 KCC 행사에 이어 이번 기회를 통해 논문의 내용을 한번 더 소화할 수 있었고, 나에게 있어 이 경험들이 가지는 의미를 다시 한 번 생각해볼 수 있었다. 포스터 제작 포스터 제작은 논문의 내용과 KCC 발표 PPT를 바탕으로 틀을 만든 뒤 더 구체적인 예제들을 찾고, 예제들로부터 의미 있는 발견들을 꺼내는 것으로부터 시작되었다. 포스터를 통해 논문의 내용을 잘 보여주는 것을 넘어서, 논문... Read More
-
[Experience] KCC 2022 참가 후기
배경 지난 22-1학기 중 감사하게도 우리 연구실 박사 과정 연구생과 함께 조사 연구에 참여할 수 있는 기회가 생겨 KCC에 논문을 제출했고, 그 논문이 Accept되어 제주에서 열리는 학회에 참가할 수 있게 되었다. 논문 제출 직후 학부 과제와 이런저런 일들이 쏟아져서 아직 그 과정과 느낀점 등을 정리하지 못했는데, 개인적으로 정말 즐거웠고 이런저런 생각을 많이 하게 되었던 경험이라 이 부분도 곧 정리할 수 있으면 좋을 것 같다. 어쨌든, 이번에는 제주도에서 4일간 학회에 참여한 경험을 글로 남겨보려 한다. Day 0. 나를 포함해 발표를 위해 먼저 출발하는 사람들은 오후 2:45쯤 교수님 오피스에 모여 함께... Read More
-
[TIL] 2022 1월 TIL
22.01.06.Thu ase21-industry 논문을 읽기 시작했다. Ubuntu 서버와 맥OS에서 AFL++을 빌드하고 사용법을 익혔다. 22.01.07.Fri AFL++을 사용해 오픈소스 프로젝트의 버그를 찾아보기 시작했다. mpc의 mpca_lang()을 대상으로 AFL++을 사용해 보았다. » 버그 하나를 찾았다. 22.01.10.Mon 3일간 AFL++로 mpc를 fuzzing한 결과 생성된, timeout과 crash를 유발하는 input들을 사용해 버그 리포트 쓰기를 시작했다. mpc의 소스코드에서 버그를 유발하는 mpca_lang_st()를 찾았다... Read More
-
[Paper Review] Improving Configurability of Unit-level Continuous Fuzzing
Improving Configurability of Unit-level Continuous Fuzzing : An Industrial Case Study with SAP HANA 논문 전문 : https://hongshin.github.io/pubs/ase21-industry.pdf Summary customized mutation operator들을 효율적으로 이용하기 위한 5개의 새로운 mutation scheduling strategies 제안 3개의 새로운 seed corpus selection strategies 제안 결과 : Fuzzing framework을 target componen... Read More
-
[TIL] 8월 4주 TIL
21.08.23.Mon gcov의 -b 옵션을 이용하여 branch coverage를 구하는 부분을 fuzzer에 추가했다. 21.08.24.Tue regcomp, regexec을 사용하여 정규표현식을 이용한 간단한 url parser를 구현해 보았다. 21.08.25.Wed 기존에 구현했던 fuzzing architecture에 mutation-based fuzzer를 추가했다. Read More
-
[TIL] 8월 3주 TIL
21.08.16.Mon 초기 troff가 가지고 있던 bug situation들을 간단하게 구현하여 random fuzzer로 테스트해 보았다. 21.08.17.Tue random fuzzer를 사용하여 hunspell을 테스트해 보았다. Black-Box testing과 White-Box testing의 차이를 알게 되었다. 21.08.18.Wed gcov를 사용해 code coverage(line coverage)를 확인해 보았다. gcov 파일을 읽어 코드의 실행된 라인 번호를 저장하는 코드를 작성해 보았다. 21.08.19.Thu gcov를 사용해 code covera... Read More
-
[TIL] 8월 2주 TIL
21.08.09.Mon Linked list로 구현된 프로그램을 대상으로 Program specific checker를 만들어 보았다. 21.08.10.Tue C에서 Object Oriented Design을 구현하는 방법을 고민해 보았다. 21.08.11.Wed struct와 function pointer를 사용하여 Object를 구현해 보았다. Test driver와 Fuzzer의 기본적인 구조를 고민해 보았다. 21.08.13.Fri generic한 fuzzer를 구현하였다. Read More
-
[TIL] 8월 1주 TIL
21.08.02.Mon The Fuzzing Book 공부를 시작했다. 아주 간단한 fuzzer를 이용하여 랜덤한 string input을 만들어 보았다. 간단한 Manual test와 fuzzer를 이용한 Random test를 해 보았다. 21.08.03.Tue Fuzzer를 통해 발견된 bug들의 예시를 간단하게 시뮬레이션해 보았다. 21.08.04 Wed Fuzzer와 fork, pipe, exec을 사용하여 external program을 test해 보았다. 21.08.05 Thu pipe에 대한 이해가 부족해 추가적으로 공부했다. (link) 21.08.06.F... Read More
-
[TIL] C++ Study - Day 2
Chapter 3. Reference Types C++ 의 references (using &)에 대해 공부했다. const 키워드에 대해 공부했다. 함수의 argument를 const로 선언하면 함수의 scope 내에서 해당 argument의 수정을 막는다. method를 const로 선언하는 것은 해당 method 내에서 current object의 state를 수정하지 않는다는 의미이다. object의 member variable을 const로 선언하면, 해당 멤버 변수는 initialization 이후에는 수정할 수 없다. 객체의 ... Read More
-
[TIL] C++ Study - Day 1
Textbook : C++ Crash Course Chapter 2. Types C++의 다양한 fundamental type(primitive type)들과 그에 해당하는 format specifier들을 공부했다. C++에서 변수와 array, string을 초기화하는 방법을 알게 되었다. C++의 range-based for loop을 사용해 보았다. C++의 switch statement를 사용해 보았다. plain-old-data class(struct)와 union의 차이를 알게 되었다. union은 멤버들 중 가장 큰 것 만큼의 메모리를 잡아 멤버들 사이에 공... Read More
-
[TIL] xv6 Study - Day 10
Lab 3. Memory Management Stack overflow로 인한 page fault가 일어나면 stack을 한 페이지씩 grow할 수 있도록 수정해 보았다. Trap을 handling하는 코드에 page fault의 case를 추가했다. Stack overflow로 인한 page fault가 맞는지를 확인하여 (using %cr2) 새로운 stack을 allocate한다. Additional. LKM Rootkit 특정 process의 kill을 막는 Loadable Kernel Module을 구현해 보았다. 모듈의 i... Read More
-
[TIL] xv6 Study - Day 9
xv6의 user memory layout을 바꿔보았다. Original Layout : code & data와 heap 사이에 1 page size의 stack이 있다 (grow backword) Modified Layout : stack이 kernel 바로 밑에 있다 (grow backword) Memory layout을 바꾸기 위해, 프로그램을 메모리에 load하고 page table을 setup하는 과정을 수정했다. process의 virtual address space에서 stack의 끝과 heap의 끝을 추적하는 field를... Read More
-
[TIL] xv6 Study - Day 8
process의 priority를 수정하거나 가져올 수 있는 system call을 추가했다. 모든 팀원들의 test case에서 동작할 수 있도록 하기 위해 api를 통일하였다. int getpriority(int pid, int * prio) ; int setpriority(int pid, int prio) ; Round-Robin Scheduler를 Priority Scheduler로 바꿔 보았다. context switch가 일어날 때 RUNNABLE process 중 priority 값이 가장 큰 pr... Read More
-
[TIL] xv6 Study - Day 7
Goals: Understand how the scheduler works. Understand how to implement a scheduling policy and characterize its impact on performance. Understand priority inversion and a possible solution for it. System Call setpriority() system call을 추가하기 위해서, proc.c에 setpriority(int pid, int val)를 implement한다. defs.h에 setpriority의 정의를 추가한다. sysproc.c... Read More
-
[TIL] xv6 Study - Day 6
Example w/ wait() system call User program : call wait() trapasm.S : build trap frame (stack switch) & call trap() trap.c : trap frame에 저장된 trap number가 T_SYSCALL이면 call syscall() syscall.c : syscall table에서 tf->eax에 저장된 SYS_wait을 index로 사용하여 system call handler function인 sys_wait()을 부른다 sys_wait : argptr()을 사용해 user stack에 저장... Read More
-
[TIL] xv6 Study - Day 5
Code : Assembly trap handlers (textbook p.42) int : processor가 trap을 발생시키도록 하는 instruction (x86에는 256개의 interrupt가 있다.) xv6는 trap이 일어났을 때 x86 하드웨어가 stack switch를 하도록 한다. 하드웨어가 stack segment selector와 new value for esp(esp가 이제 어디를 point해야 하는지)를 load한다. switchuvm : user process의 kernel stack의 top address를 task segment descri... Read More
-
[TIL] xv6 Study - Day 4
Deeper Understanding - execption and system call xv6 커널에 event가 일어나면 HW가 kernel mode로 전환하여 trap을 처리하도록 한다. trap frame : user stack을 가리키는 pointer 등 중요한 argument들을 trap handler에게 넘겨주기 위해 사용되는 data structure이다. syscall syscall() : 모든 system call들에 대한 top level handler. trap frame에 저장된 eax register(from user code)로부터 system cal... Read More
-
[TIL] xv6 Study - Day 3
3. The Kernel entry가 CR0_PG를 %CR0에 넣으면 paging hardware가 enable된다. 커널을 high memory에 mapping하기 위해 stack pointer를 initialize한다. movl $(stack + KSTACKSIZE), %esp 여기서 stack은 kernel.sym에 0x8010a5c0으로 선언되어 있으며, KSTACKSIZE는 4096으로 선언되어 있다. 합한 값이 high addr.이므로, entry의 실행이 끝나고 low mapping이 사라져도 stack이 valid할 수 있게 된다. 과정을 마치면 mai... Read More
-
[TIL] xv6 Study - Day 2
2. The Boot Loader ELF : Executable Linkable Format ELF binary ELF header program header table : load될 program section의 list를 담고 있다. program sections : .text .rodata .data .bss … VMA (Virtual Memory Address) : Link address. 해당 section이 load 되어야 하는 주소 LMA (Load Memory Address) : Load address. 해당 secti... Read More
-
[TIL] xv6 Study - Day 1
1. Physical Address Space GNU 소프트웨어 시스템을 위한 기본 디버거인 gdb(GNU Debugger)를 사용해 보았다. b : breakpoint x/Ni ADDR : 메모리에서의 instruction 실행을 확인할 수 있다. (N: 확인할 instruction의 개수) c : continue si : step instruction 초기의 PC는 1MB의 physical memory만 사용할 수 있었다. 640KB Low Memory : RAM 384KB : reserved by HW ... Read More
-
[TIL] System Programming Study - Day 10
Description dsh(server) 명령을 입력받고 terminal에게 전송하는 역할을 하는 쓰레드와, 각 소켓에 연결되어 실행 결과를 받아오는 쓰레드들이 있다. 새로운 클라이언트들이 연결될 때 마다 Linked list에 임의로 생성한 ID와 해당하는 소켓의 file descriptor를 저장해둬야 한다. 실행 중에 dsh에서 특정 문자를 보내면 terminal의 명령어 실행을 종료시킬 수 있어야 한다. 유저가 Ctrl+C를 누르면 원하는 terminal을 선택할 수 있어야 한다. Ctrl+C를 눌렀을 때 다른 terminal의 실행 결과를 출력하는 것을 멈춰야 한다. (termina... Read More
-
[TIL] System Programming Study - Day 9
Description 전에 만들었던 채팅 서버를 이용하여 distributed shell을 구현한다. 서버(dsh)에서 원하는 terminal을 골라 명령어를 보내면 해당 terminal에서 명령을 실행하고 그 결과를 dsh로 전송한다. TIL dup2 int dup2(int oldfd, int newfd); newfd가 oldfd와 같은 open file descriptor를 참조하도록 adjust된다. 즉, oldfd가 newfd에 덮어씌워진다. 실행에 성공할 경우 새로운 file descriptor를 리턴하고, 에러일 경우 -1을 리턴한다. exec int execl (const char ... Read More
-
[TIL] System Programming Study - Day 8
Description & Questions 클라이언트의 디렉토리는 모두 비어있다고 가정한다. 서버와 클라이언트 모두 파일 이름과 버전에 대한 메타데이터를 담은 linked list(+ hidden file)을 가지고 있다. (+) 처음 서버를 실행시켰을 때, 서버가 관리하는 디렉토리에 이미 존재하는 파일들이 있었을 경우에 대한 해결 방법이 필요하다. (+) 서버나 클라이언트 프로그램이 도중에 꺼졌을 경우와 위와 같은 경우를 대비해 hidden file에 파일 목록과 버전 정보를 저장해 두어야 한다. 클라이언트쪽 디렉토리에 새로운 파일이 생길 경우 자동으로 서버에 put 한다. ... Read More
-
[TIL] System Programming Study - Day 7
Description 서버와 클라이언트의 디렉토리는 모두 비어있다고 가정한다. 서버와 클라이언트 모두 파일 이름과 버전에 대한 메타데이터를 담은 linked list(+ hidden file)을 가지고 있다. 클라이언트쪽 디렉토리에 새로운 파일이 생길 경우 자동으로 서버에 put 한다. (using inotify()) 서버는 파일을 받아 버전 정보를 업데이트한 뒤, 해당 클라이언트에게 버전 넘버를 알려준다. 클라이언트는 서버로부터 받은 버전 넘버를 list에 저장한다. 클라이언트는 지속적으로 서버에 list를 요청한다. 서버는 파일의 이름과 버전 정보를 함께... Read More
-
[TIL] System Programming Study - Day 6
TIL setsocketopt()를 사용하여 non-blocking I/O를 구현할 수 있다. int option = 1 ; setsockopt(new_socket, SOL_TCP, TCP_NODELAY, &option, sizeof(option)) ; option을 1로 주는 것은 Nagle 알고리즘(가능하면 조금씩 자주 보내지 말고 한번에 많이 보낸다)을 off 한다는 의미이다. (0일 경우 Nagle 알고리즘 on -> Default) TCP_NODELAY로 socket의 옵션을 설정하면 write stream을 shutdown하지 않아도 데이터가 전송된... Read More
-
[TIL] System Programming Study - Day 5
Description fshare - Command Line Interface fshared (server) : ./fshared -p <port_num> -d <dir_name> & fshare (client) : ./fshare <ip_addr> <command> (<file_name>) commands : list, get, put TIL strtok()는 string에서 두 번째 인자(delim)를 찾아 \0로 바꾸고 주소를 반환한다. 그러나 연속적으로 ... Read More
-
[TIL] System Programming Study - Day 4
Description Background Study Q1. Change server.c and client.c to use multithreading instead of multiprocessing Q2. Change server.c such that it regards the message received from a client as the name of a text file and transfers the text data of the file in the local directory back to the client. fshare - Command Line Interface fshared ... Read More
-
[TIL] System Programming Study - Day 3
Description Preparing to implement fshare 1.0: Simple File Sharing System Study the basics of the TCP/IP networking with a simple server-client example server.c client.c Have a Q&A session with the teammates after personally understanding the code. TIL TCP와 UDP의 차이는 데이터를 전송한 뒤 그것을 온전히 ... Read More
-
[TIL] System Programming Study - Day 2
Description This task asks you to construct star, a simplified version of a file-archiving program tar. star provides two functionalities. it generates a file that aggregates all files in a specified directory (i.e., archive). for a given archive file generated by itself, star restores all files with their original file names (i.... Read More
-
[TIL] System Programming Study - Day 1
파일을 Binary로 읽고 쓰는 것과 Text로 읽고 쓰는 것의 차이를 이해하기 위해 fread() 와 fwrite() 를 사용해 보았다. 파일을 바이너리로 읽는다는 것은 간단하게 말하면 파일을 byte 단위로 읽는다는 것으로, ‘바이너리 파일을 읽는다’는 것과는 다르다. dirent.h 의 opendir() 로 디렉토리를 열고, readdir() 로 읽어서 dirent 구조체를 사용해 directory entry에 접근할 수 있다. stat system call 을 사용해 파일의 크기, 타입과 같은 정보를 얻을 수 있다. 바로 코드를 짜는 것 보다 생각을 마치고 짜는 것이 훨씬 더 효율적이고 안전... Read More