Recent posts

Deleting Azure "dangling" role assignments

Azure 클라우드에서 dangling role assignment 가 200여개가 생겨있길래 지웠다.

청소하는 Azure CLI 스크립트는 다음과 같다.

az role assignment delete --verbose --ids $(az role assignment list --all | jq -r '.[] | if (.resourceGroup | length == 0) and (.principalName | length == 0) then .id else empty end')

Role Assignment

Azure 클라우드에서 RBAC (role based access control) 은 “role assignment” 라는 단위로 정의된다. 하나의 role assignment 는 다음으로 구성된다. 자세한 내용은 Azure Docs에 잘 나와있다.

  • assignee or principal (주체): 누구에게
  • scope (범위): 어디에서
  • role (역할): 무엇을 하도록 허용한다


Read more

Docker Buildkit 으로 빌드 시간 단축하기

Docker의 multi-stage build와 buildkit을 이용하여 복잡한 빌드의 시간을 단축하는 방법.

이 방법을 사용하면 덤으로 멋있는 빌드 화면을 볼 수 있다.

Read more

Golang-like Defer in C++

한동안 Go와 C++을 오가며 프로그램을 짰는데, Go의 defer를 C++에 도입하면 편하겠다는 생각이 들어서 인터넷을 뒤져서 구현하는 법을 찾았다. 이런식으로 사용할 수 있다.

FILE* fp = fopen("hello.txt");
defer{ fclose(fp); };

스마트 포인터가 정석이라고들 하지만 defer 문법이 직관적이라는 생각에 현재 프로젝트에 사용하고 있다. 약간의 공부를 하면서 배운 다양한 리소스 해제 방법을 정리해두려고 한다.

  • Go Defer
  • C++ Smart Pointers
    • Pointer Ownership
    • Non-memory Resources
    • Interfacing with Regular Pointer Code
  • C++ Defer
    • ScopeGuard
    • Syntactic Sugar
  • Conclusion

Read more

CCE 2018 Quals - VNC

지난 주 사이버공격방어대회 (CCE 2018) 에 일반방어팀으로 참가하였다.

예선 1번 문제는 캡쳐한 VNC 원격데스크탑 패킷을 분석하여 정보를 알아내는 것이다.
암호화가 안 되어있어서 와이어샤크에서 내용이 그대로 보였다.

1. 키보드와 클립보드

제일 눈에 띄는 키보드 패킷만 골라보면 클라이언트가 _Y0u_g)t_VNC 를 입력했음을 알 수 있다.


그 다음 클립보드를 통해 _scr33n_Sh00t를 붙여넣기했음을 알 수 있다.


둘 다 _ 로 시작하는 걸 보니 앞부분에 몇 글자가 더 있는 것 같다.
남은 부분은 화면상에 적혀있을 것이라고 짐작할 수 있다.

Read more

Cross compiling Linux ARM kernel modules

This guide will allow you to cross-compile a loadable kernel module (LKM; a.k.a. device driver) for a ARM Linux system.

1. Target system

I will use this configuration as an example, but you can apply the same method for other environments.

  • ARMv7 (32-bit)
  • ARM qemu emulating vexpress-a9 board
  • Linux is running in qemu.

2. Download linux kernel source

Download the kernel source from

You must download the exact version which is running in the qemu.

Note that source for 3.2.0 is named linux-3.2.tar.gz, not linux-3.2.0.tar.gz.

3. Download cross compiler toolchain

Linaro’s prebuilt toolchain generally works well. Download one from

Pick a version, and choose the appropriate architecture. In our case, it would be arm-linux-gnueabihf (ARM 32-bit, linux, little endian, hard float).

There are three kinds of files: gcc-linaro-, runtime-gcc-linaro-, and sysroot-eglibc-linaro-. You only need the first one. For more info, refer to this Linaro wiki page.

For instance, go to 4.9-2017.01/arm-linux-gnueabihf/ directory and download gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz.

4. Take out kernel build config

We need to build the kernel first, and then build a kernel module. But to compile a kernel, we must have the exact build configuration of the currently running Linux system. Fortunately, you can get a copy from a running system. Look at these locations:

  • /proc/config.gz
  • /boot/config
  • /boot/config-*

Copy the file out of the qemu using scp or something.

5. Build the kernel

You need auto-generated files in order to build a kernel module. Otherwise you may encounter an error message like this:

/home/ubuntu/linux-3.2/include/linux/kconfig.h:4:32: fatal error: generated/autoconf.h: No such file or directory
    #include <generated/autoconf.h>

To build a kernel with given config file,

cp <CONFIG_FILE> .config
make ARCH=arm CROSS_COMPILE=<TOOLCHAIN_DIR>/bin/arm-linux-gnueabihf- oldconfig
make ARCH=arm CROSS_COMPILE=<TOOLCHAIN_DIR>/bin/arm-linux-gnueabihf-

Complete kernel build may not be necessary because what you need is generated header files.

6. Build the module

Write a Makefile as follows:

PWD := $(shell pwd)
obj-m += hello.o

        make ARCH=arm CROSS_COMPILE=$(CROSS) -C $(KERNEL) SUBDIRS=$(PWD) modules
        make -C $(KERNEL) SUBDIRS=$(PWD) clean

And create a hello world module.

// hello.c
#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void) {
    printk(KERN_INFO "Hello world.\n");
    return 0;

void cleanup_module(void) {
    printk(KERN_INFO "Goodbye world.\n");

Finally run this command.

make KERNEL=<LINUX_SOURCE_DIR> CROSS=<TOOLCHAIN_DIR>/bin/arm-linux-gnueabihf-

Then you will get hello.ko compatible with the running ARM Linux.