BLOG main image
분류 전체보기 (222)
Reversing (13)
Pwnable (4)
Linux Kernel (3)
Crypto (2)
Wargames (66)
Programming (18)
Write Up (32)
Project (22)
Web (2)
My Life (52)
Memo (3)
etc (2)
발표자료 (1)
36,063 Visitors up to today!
Today 12 hit, Yesterday 30 hit
daisy rss
tistory 티스토리 가입하기!
'분류 전체보기'에 해당되는 글 222건
2018.04.24 21:40
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int main(void)
{
    double a = 0, b = 0;
 
    std::cin >> a >> b;
 
    std::cout.precision(16);
    std::cout << a / b << std::endl;
 
    return 0;
}
cs


Name
Password
Homepage
Secret
2018.04.24 21:22
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <iterator>
#include <string>
 
int main(void)
{
  std::istreambuf_iterator<char> begin(std::cin), end;
  std::string s(beginend);
  std::cout << s;
 
  return 0;
}
cs


'Programming > C++' 카테고리의 다른 글

C++에서 문자열 EOF까지 입력받고 출력하기  (0) 2018.04.24
c++ 템플릿 공부  (0) 2017.08.29
Lvalue와 Rvalue  (0) 2017.05.20
Name
Password
Homepage
Secret
2018.03.27 14:38


x86-64 리눅스 커널을 디버깅 하는 방법입니다.

커널을 디버깅하기 위해 host-machine, target-machine이 필요한데 host-machine은 우분투 x86-64라고 가정하고 target-machine은 커널을 qemu에 올려서 vm으로 진행하겠습니다.

먼저 디버깅할 버전의 커널을 컴파일 해야합니다.

커널을 다운로드 받고 (http://kernel.org) 압축을 풀어서 커널 디렉토리로 이동한 후

make defconfig
make kvmconfig
make menuconfig

를 순서대로 실행해줍니다.

make menuconfig를 하면 옵션을 선택할 수 있는 창들이 뜰 텐데 여기서 

Kernel Hacking
    compile-time checks and compiler options
        compile the kernel with debug info 체크

를 해준 후 exit하면 make를 하기 위한 설정이 다 되었습니다.

이제 make를 해서 빌드를 시작하고 기다리면 됩니다.

빌드가 다 되었다면 arch/x86/boot/bzImage에 커널 파일이 생기고 최상위 디렉토리에 vmlinux파일이 정상적으로 생겼을 것입니다. 이 파일을 vm을 구성할 디렉토리로 옮겨줍니다.

다음은 파일시스템을 구성해야합니다.

sudo apt-get install debootstrap를 해서 다운로드 해주고 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash
# Copyright 2016 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
 
# create-image.sh creates a minimal Debian-wheezy Linux image suitable for syzkaller.
 
set -eux
 
# Create a minimal Debian-wheezy distributive as a directory.
RELEASE=wheezy
DIR=wheezy
sudo rm -rf $DIR
mkdir -p $DIR
sudo debootstrap --include=openssh-server,curl,tar,gcc,libc6-dev,time,strace,ltrace,sudo,less,psmisc,selinux-utils,policycoreutils,checkpolicy,selinux-policy-default,gdb $RELEASE $DIR
 
# Set some defaults and enable promtless ssh to the machine for root.
sudo sed -'/^root/ { s/:x:/::/ }' $DIR/etc/passwd
echo 'T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100' | sudo tee -a $DIR/etc/inittab
printf '\nauto eth0\niface eth0 inet dhcp\n' | sudo tee -a $DIR/etc/network/interfaces
echo 'debugfs /sys/kernel/debug debugfs defaults 0 0' | sudo tee -a $DIR/etc/fstab
echo 'SELINUX=disabled' | sudo tee $DIR/etc/selinux/config
echo "kernel.printk = 7 4 1 3" | sudo tee -a $DIR/etc/sysctl.conf
echo 'debug.exception-trace = 0' | sudo tee -a $DIR/etc/sysctl.conf
echo "net.core.bpf_jit_enable = 1" | sudo tee -a $DIR/etc/sysctl.conf
echo "net.core.bpf_jit_harden = 2" | sudo tee -a $DIR/etc/sysctl.conf
echo "net.ipv4.ping_group_range = 0 65535" | sudo tee -a $DIR/etc/sysctl.conf
echo -en "127.0.0.1\tlocalhost\n" | sudo tee $DIR/etc/hosts
echo "nameserver 8.8.8.8" | sudo tee -a $DIR/etc/resolve.conf
echo "debugging-machine" | sudo tee $DIR/etc/hostname
ssh-keygen -f $RELEASE.id_rsa -t rsa -''
sudo mkdir -p $DIR/root/.ssh/
cat $RELEASE.id_rsa.pub | sudo tee $DIR/root/.ssh/authorized_keys
 
# Build a disk image
dd if=/dev/zero of=$RELEASE.img bs=1M seek=2047 count=1
sudo mkfs.ext4 -F $RELEASE.img
sudo mkdir -/mnt/$DIR
sudo mount -o loop $RELEASE.img /mnt/$DIR
sudo cp -a $DIR//mnt/$DIR/.
sudo umount /mnt/$DIR
cs

위 코드를 create-image.sh로 붙여넣고 실행해주면 됩니다.
(google syzkaller에서 가져옴 (https://github.com/google/syzkaller/blob/master/tools/create-image.sh))

wheezy.img까지 정상적으로 생성되었다면 이제 부팅을 할 시간입니다.

qemu가 없다면 sudo apt-get install qemu kvm qemu-kvm을 해서 설치해주고

qemu-system-x86_64 -kernel bzImage -append "console=ttyS0 root=/dev/sda debug" -hda wheezy.img -net user,hostfwd=tcp::10021-:22 -net nic -nographic -m 4G -smp 2 -s

을 이용해서 부팅할 수 있습니다.

kernel은 아까 컴파일한 bzImage파일을 사용하겠다는 의미이고 이미지는 wheezy.img, 22번 포트를 10021포트로 리다이렉팅 했기 때문에 ssh -p 10021 -i wheezy.id_rsa root@localhost를 이용해서 ssh접속을 할 수 있습니다.

그리고 메모리 4G, cpu코어 두개를 할당하고 1234번 포트로 gdb 디버깅이 들어오도록 listen하고 있겠다는 의미입니다.

만약 본인의 cpu가 가상화를 지원한다면 -enable-kvm 옵션을 추가해서 좀 더 빠르게 qemu를 돌릴 수 있습니다.

이제 정상적으로 부팅이 됐다면 디버깅을 해볼 차례입니다. qemu를 종료하고 gdb -q ./vmlinux를 해서 심볼을 로드합니다.

그 후 b*start_kernel을 해서 커널의 첫 시작 함수인 start_kernel에 브레이크 포인트를 걸고 target remote localhost:1234를 해서 1234번 포트로 디버기가 붙기를 기다립니다.

그 후 다시 qemu를 부팅한다면 gdb로 커널이 붙게됩니다. 그 상태에서 c를 입력해주면 start_kernel에 브레이크 포인트가 걸립니다.

심볼까지 로드했기 때문에 현재 어셈의 위치와 소스를 비교하면서 디버깅 할 수 있습니다.

이제 원하는 함수 / 드라이버에 브레이크 포인트를 걸고 디버깅하면 됩니다.

Name
Password
Homepage
Secret
2018.03.27 11:37


낮은 버전의 커널을 최신 혹은 높은 버전의 gcc로 컴파일 할 때 
cc1: error: code model kernel does not support PIC mode
라는 에러를 볼 수 있다. gcc특정 버전 이상에서는 pie적용이 기본으로 설정되어있어서 나는 오류이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
diff --git a/Makefile b/Makefile
index dda982c..f96b174 100644
--- a/Makefile
+++ b/Makefile
@@ -608,6 +608,12 @@ endif # $(dot-config)
 # Defaults to vmlinux, but the arch makefile usually adds further targets
 all: vmlinux
 
+# force no-pie for distro compilers that enable pie by default
+KBUILD_CFLAGS += $(call cc-option, -fno-pie)
+KBUILD_CFLAGS += $(call cc-option, -no-pie)
+KBUILD_AFLAGS += $(call cc-option, -fno-pie)
+KBUILD_CPPFLAGS += $(call cc-option, -fno-pie)
+
 # The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
 # values of the respective KBUILD_* variables
 ARCH_CPPFLAGS :=
cs

이 코드를 pie.patch로 만들고 커널 소스 최상위 디렉토리에서 

patch -p1 < pie.patch 해주면 된다. (Makefile을 다 설정해준 후에 해줘야한다.)

Name
Password
Homepage
Secret
2018.03.20 15:57

가끔씩 옛날 버전 컴파일 하다가 ____ilog2_nan 이거 없다고 에러날 때가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
diff --git a/include/linux/log2.h b/include/linux/log2.h
index ef3d4f67118c..07ef24eedf83 100644
--- a/include/linux/log2.h
+++ b/include/linux/log2.h
@@ -16,12 +16,6 @@ 
 #include <linux/bitops.h>
 
 /*
- * deal with unrepresentable constant logarithms
- */
-extern __attribute__((const, noreturn))
-int ____ilog2_NaN(void);
-
-/*
  * non-constant log of base 2 calculators
  * - the arch may override these in asm/bitops.h if they can be implemented
  *   more efficiently than using fls() and fls64()
@@ -85,7 +79,7 @@  unsigned long __rounddown_pow_of_two(unsigned long n)
 #define ilog2(n)                \
 (                        \
     __builtin_constant_p(n) ? (        \
-        (n) < 1 ? ____ilog2_NaN() :    \
+        (n) < 1 ? 0 :            \
         (n) & (1ULL << 63) ? 63 :    \
         (n) & (1ULL << 62) ? 62 :    \
         (n) & (1ULL << 61) ? 61 :    \
@@ -149,9 +143,7 @@  unsigned long __rounddown_pow_of_two(unsigned long n)
         (n) & (1ULL <<  3) ?  3 :    \
         (n) & (1ULL <<  2) ?  2 :    \
         (n) & (1ULL <<  1) ?  1 :    \
-        (n) & (1ULL <<  0) ?  0 :    \
-        ____ilog2_NaN()            \
-                   ) :        \
+        0           ) :        \
     (sizeof(n) <= 4) ?            \
     __ilog2_u32(n) :            \
     __ilog2_u64(n)                \
cs

이거 커널 소스 디렉토리에서 이거 붙여넣어서 ilog.patch로 저장하고 patch -p1 < ilog.patch 하면 지가 알아서 패치해준다.

그리고 다시 make ㄲㄲ

Name
Password
Homepage
Secret
2018.03.08 14:43
[etc]

sudo socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS08 하면 /dev/ttyS08 이 열림

minicom -D /dev/ttyS08 해서 시리얼 열고 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <termios.h>
#include <fcntl.h>
 
int main( void)
{
   int fd;
 
   struct termios newtio;
 
   fd = open( "/dev/ttyS8", O_RDWR | O_NOCTTY | O_NONBLOCK );
 
   if (fd == -1) {
       puts("open error");
       return 0;
   }
 
 
   memset( &newtio, 0sizeof(newtio) );
 
 
   newtio.c_cflag = B115200;
   newtio.c_cflag |= CS8;
   newtio.c_cflag |= CLOCAL;
   newtio.c_cflag |= CREAD;
   newtio.c_iflag = 0;
   newtio.c_oflag = 0;
   newtio.c_lflag = 0;
   newtio.c_cc[VTIME] = 0;
   newtio.c_cc[VMIN] = 1;
 
   tcflush (fd, TCIFLUSH );
   tcsetattr(fd, TCSANOW, &newtio );
 
   write( fd, "Hello, World!"13);
 
   close( fd);
 
   return 0;
}
cs

일케 소스 짜서 돌리면 minicom으로 Hello, World!가 옴

'etc' 카테고리의 다른 글

리눅스 가상 시리얼 포트 열기  (0) 2018.03.08
BMP File Header  (0) 2015.11.13
Name
Password
Homepage
Secret
2017.12.26 17:50

다시 오랜만에 쓰는 일기~

요즘 리눅스 커널에 관심이 좀 있다. 이론 공부도 할만한거 같고 커널 익스 해보는거도 재밌다.

워게임 문제로는 w3challs knoob 풀어봤는데 처음 제대로 풀어보는 커널 문제라 아리송 하면서도 재밌었다.

지금은 pwnable.kr softmmu를 풀고 있는데 취약점 찾고 대충 익스 시나리오도 구상이 되지만 이게 내맘대로 잘 안돼서 어렵다.

꽤 오래 붙잡고 있는거 같은데 음 어렵다.

빗소리 (http://rainymood.com) 들으면서 공부하면 집중 되게 잘된다. 

한여름 장마철에 공부하는 기분이라서 기분이 상쾌해진다.

'My Life > Diary' 카테고리의 다른 글

2017년 12월 26일 화요일  (2) 2017.12.26
2017년 10월 31일 화요일  (2) 2017.10.31
2016년 3월 25일 금요일  (2) 2016.03.26
2016년 2월 21일 일요일  (3) 2016.02.21
2016년 2월 15일 월요일  (2) 2016.02.15
2016년 2월 12일 금요일  (4) 2016.02.13
ec0n0my | 2018.01.03 23:54 신고 | PERMALINK | EDIT/DEL | REPLY
안녕하세요! 혹시 reversing.kr 워게임은 얼마나 잡고 올클하셨는지 알려주실 수 있나요? 제가 리버싱 공부를 한지 1년 정도가 지나갔지만 리버싱의 대표 워게임이라 할 수 있는 립케알은 반 정도 밖에 풀지 못했습니다..ㅠㅠ 그리고 실례가 안된다면 리버싱을 공부하는 것에 대해 조그마한 조언 하나 부탁드려도 될까요?..
ec0n0my | 2018.01.04 10:47 신고 | PERMALINK | EDIT/DEL
우와 감동입니다 ㅠㅠ 친절한 답변 감사합니다 열심히 그리고 꾸준히 공부하고 시도해보겠습니다 감사합니다 ㅎㅎ
Name
Password
Homepage
Secret
kernel - knoob
[보호되어 있는 글입니다. 비밀번호를 입력해 주세요.]

Secret Entry! Enter Password



2017.12.21 17:34

mmap_min_addr : sysctl -a | grep vm.mmap

smep : cat /proc/cpuinfo | grep smep

kaslr : cat /proc/kallsyms | grep _text | head -n 1

'Memo' 카테고리의 다른 글

kernel 보호기법 확인  (0) 2017.12.21
xinetd 데몬 서비스 설정  (0) 2016.03.30
adb 패턴 해제  (0) 2016.02.24
Name
Password
Homepage
Secret
2017.10.31 23:04


일기 짱 오랜만이다. 일기 썼던 사실도 까먹고 있다가 어쩌다가 다시쓴당

일년 반 좀 넘게만에 쓰는데 그동안 많은 일이 있었다. 대회에서 상도 몇 번 타고 비오비 5기도 수료하고 학교도 그럭저럭 잘 다니고 있다.

이제 수능 16일 전이라 애들 다 하루종일 도서관 올라가 있고 나는 하루종일 그린아이티에서 지낸다. 컴퓨터 자유롭게 쓰는건 좋은데 요즘 잠이 너무 많이 온다.

문제를 풀다가 풀 방법이 보이지가 않으면 자꾸 잠이 오게 된다. 근데 자고 일어나면 조금씩 문제가 풀린당 근데 잠자는 시간은 좀 아깝다ㅜㅜ

오늘 드디어 w3challs.com에 wargame 카테고리의 x86 - convert 문제를 풀었다.

포맷스트링 문제였는데 푸는데 한 일주일 걸린거 같다. 처음에는 풀 방법이 안보였는데 삽질하다 보니까 풀렸다.

w3challs 문제들 짱 좋은거 같다. 리버싱이랑 포너블은, 근데 좀 어렵다.

icg ctf 1등 했던거 상금 오늘 들어왔다. 0.03974485 BTC만큼 줬다. 30만원 좀 안되는데 비트코인 거래 처음 해봐서 짱 신기하다.

그리고 이게 가격이 유동적으로 변하는거도 신기하다. 아까 받을 때는 27만원이었는데 지금 보니까 28만원으로 올랐다. 가격 올라갔다 내려갔다 하는거 중간중간 보는 재미가 쏠쏠하당

그냥저냥 헛되게 보내는 시간이 요즘 꽤 되는거 같은데 이런거 없애야 할거같다. 잠 좀 자지 말장

의식의 흐름대로 써봤다. 매일매일 쓸 수 있도록 노력해야겠다.

'My Life > Diary' 카테고리의 다른 글

2017년 12월 26일 화요일  (2) 2017.12.26
2017년 10월 31일 화요일  (2) 2017.10.31
2016년 3월 25일 금요일  (2) 2016.03.26
2016년 2월 21일 일요일  (3) 2016.02.21
2016년 2월 15일 월요일  (2) 2016.02.15
2016년 2월 12일 금요일  (4) 2016.02.13
song___99 | 2017.11.21 21:23 신고 | PERMALINK | EDIT/DEL | REPLY
왜 까먹으셨나요? 반성하시길ㅎㅎㅎㅋㅎㅎㅎㅎㅎㅋㅎ
5unKn0wn | 2017.11.21 21:51 신고 | PERMALINK | EDIT/DEL
앞으로는 안까먹게 자주자주 알려주세여ㅠㅠㅠ
Name
Password
Homepage
Secret