함수 호출 규약
·
STUDY/CS
호출 및 반환에 대한 약속 함수를 호출할 경우 반환된 이후를 위해서 호출자(Caller)의 상태(Stack Frame)와 반환주소(Return Address)를 저장해야한다.(원래 흐름으로 돌아와야하니까!)또한 호출자는 피호출자(Callee)가 요구하는 인자를 전달하고, 피호출자의 실행이 종료될 때 반환 값`을 전달받아야한다. 보통은 코드에 호출 규약을 명시하지 않는다면, 컴파일러가 지원하는 호출 규약 중 CPU 아키텍처에 적합한 것을 자동으로 선택한다.컴파일러의 도움 없이 직접 어셈블리 코드를 작성하거나, 어셈블리어 코드를 읽으려면 함수 호출 규약을 알 필요가 있다.(아키텍처/컴파일러 따라 함수 호출 규약 달라지기 때문) *x86 아키텍처는 레지스터로 피호출자 인자를 전달하기에는 레지스터 수가 적..
Pwntools
·
STUDY/CS
Pwn은 시스템이나 프로그램의 취약점을 이용해 제어권을 빼앗는 공격이다. pwntools는 해킹하는 과정에 도움이 되는 기능들을 모아둔 도구로, 공격 스크립트를 신속하게 작성할 수 있도록 도와주는 프레임 워크이다. 파이썬 패키지 형태로 제공된다. 설치 명령어는 아래와 같다.sudo apt-get updatesudo apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essentialpython3 -m pip install --upgrade pippython3 -m pip install pwntoolsexternally-managed-environment Error가 떴다. 직역으로 외부 관리 환경 오류라는 놈인데 ..
GDB (GNU Debugger)
·
STUDY/CS
디버거는 프로그램을 실행시키면서 분석하는 도구이다. 실행중에 특정 지점에서의 프로세스 상태 진단 및 버그 찾기를 도와준다 sudo apt-get install gdb 으로 gdb를 설치할 수 있다. gef, peda, pwngdb, pwndbg 등 바이너리 분석을 위한 여러 플러그인들이 존재한다. 여기서는 pwndbg를 사용한다. 설치 과정은 아래와 같다.git clone https://github.com/pwndbg/pwndbgcd pwndbg./setup.sh파일 불러오기gdb로 디버깅 터미널을 생성한 후 가장 먼저 할 일은 디버깅할 바이너리를 GDB에 불러오는 것이다. 이는 file 명령어로 부를 수 있다. 처음 gdb를 실행할 때 gdb ./debugee 처럼 인자에 디버깅할 바이너리 경로를 넣어..
어셈블리어와 시스템콜
·
STUDY/CS
section .text global _start_start: xor rax, rax ; sum = 0 xor rcx, rcx ; cnt = 0for_loop: cmp rcx, 101 ; cnt 컴퓨터 아키텍처별로 다른 문법을 가진다. 같은 아키텍처에서도 어셈블러에 따라 다른 문법 가질 수 있다. 대표적은 문법으로 Intel문법과 AT&T문법이 있다. Intel문법은 NASM(Netwide Assembler), AT&T문법은 GAS(Gnu Assembler)에서 사용한다. 기본 구조동사에 해당하는 명령어(Operation Code)와 목적어에 해당하는 피연산자(Operand)로 구성피연산자는 0개 혹은 그 이상이 될 수 있고, 해당 연산의 입력값(레지스터, 상수, 메모리 주소...)이 된..
리눅스 메모리 레이아웃
·
STUDY/CS
*메모리 오염 Memory Corruption : 공격자가 메모리를 악의적으로 조작하여, 조작된 메모리 값에 의해 CPU가 잘못된 동작을 하게끔 하는 것 (Stack Buffer Overflow, Format String Bug, Use After Free, Double Free Bug...) 메모리 레이아웃프로세스가 실행될 때 각 프로세스는 독립된 메모리 공간을 할당받는다.메모리 공간은 용도에 따라 여러 영역으로 나뉘고, 각 영역은 특정한 목적을 가진다. 메모리 영역을 나눠서 관리하면 각 영역을 용도에 맞게 권한(r, w, x)을 부여할 수 있다. 리눅스에서 적재되는 데이터의 용도별로 나눈 메모리 영을 세그먼트(Segment)라고 한다. 코드(텍스트) 세그먼트프로그램의(실행가능한) 기계어 코드가 저장...
2진수의 음수 표현 : 부호화-크기 표현, 보수
·
STUDY/CS
컴퓨터의 ALU(산술논리장치)에는 가산기만 존재한다. 뺄셈기는 없다. 덧셈으로 모두 계산할 수 있기 때문이다. 컴퓨터가 음수를 표현하는 방법은 여러가지가 있는데, 공통적으로 MSB(Most Significant Bit, 맨 좌측 비트)를 부호비트로 사용한다는 것이다. 양수라면 0, 음수라면 1이다. 부호화-크기(signed-magnitude) 표현 MSB는 부호비트를 담고, 나머지 n-1비트에 수의 크기를 담는 방법이다. \(-(2^{n-1} - 1) ~ +(2^{n-1} - 1)\)이 최대 표현 범위이다. 8비트일 경우 1 0000000, 0 0000000으로 0의 표현이 두가지다. 예를 들어 +9의 경우 0 0001001, -9의 경우 1 0001001이 된다.하지만 (+9) + (-9)를 계산할..
Floating Points Error 부동 소수점 오류 +소수의 2진법 변환
·
STUDY/CS
논리회로 수업을 하던 도중 2진법 수업을 하다 교수님이 토픽을 꺼내셨다. 작년에 들은 학생들이 대답을 안해서 다음에 소수관련해서 다룰 때 다시 꺼내기로 하셨다... 어쩌다 유튜브에서 마주치고 클릭은 하지 않았었는데 이번 기회에 알아보고자 한다. Floating Points Error컴퓨터에서 소수는 정수처럼 이진법 전환 후 바로 저장되지 않는다. 32칸중 첫번째 칸에 부호 저장. 양0/음1변환할 숫자를 2진법으로 변환 후 소수점 바로 위 첫번째 자리가 1이 되도록 비트를 민다. (101.001 -> 1.01001 x \(2^2\))가수부분이 23자리가 되도록 0으로 채우고 가수(mantissa)를 맨뒤 23칸에 밀어넣음.지수부분에 127을 더해서 맨 앞 8칸 자리에 넣음 (2 + 127 -> 1000..