스터디/해킹실습2

[취약점 분석] 버퍼 오버플로우, Linux basics

y00&z1 2021. 11. 21. 01:43

취약점 검사 방식? 

-블랙박스 방식 : only binary (소스코드 X)

-화이트박스 방식 : 소스코드를 가진 상태에서 테스트 수행

 

리버스 엔지니어링 : 리버싱, 역공학 

바이너리에서 소스코드를 복원하는 과정 

[소스코드] - [어셈블리어] - [바이너리]

 

사용 분야 : 취약점 분석 / 악성코드 분석/ 버그 수정 / 소프트웨어 사용 제한 기능 제거 / 신기술 연구 / 디지털 포렌식

도구 : IDA ( 정적 분석 ) / OllyDbg(동적 분석) / hex editor / 자바 디컴파일러 ; jd-gui 

 

1. 버퍼 오버플로우

: 버퍼에 지정된 크기보다 더 큰 데이터를 입력 -> 버퍼의 한계를 넘어서는 현상 (문자 배열의 경계 값 검사를 하지 않아 발생하는 취약점)

=> 공격자를 이를 이용하여 일부러 컴퓨터 시스템 내에서 프로그램이 사용하는 메모리 영역을 정해진 범위 밖까지 메모리가 넘치게 하여 프로그램의 실행 흐름을 바꾸거나 특정 데이터를 변조한다. 

 

https://isc9511.tistory.com/119?category=990276 

 

버퍼 오버 플로우 (BOF - Buffer OverFlow) 공격

* BOF 공격 : 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리 범위를 넘어선 위치에 자료를 읽거나 쓸 때 발생하며, 오작동 또는 악의적 코드를 실행할 수 있게 됨 BOF 종류 설명 Stack B

isc9511.tistory.com

 

쉘코드 = 쉘을 실행시키는 기계어 코드

버퍼 오버플로우 취약점을 이용하여 메모리에 쉘코드를 올려 return address에 쉘코드가 저장된 메모리의 주소로 덮어 씌워서 쉘을 실행시키는 공격

https://d4m0n.tistory.com/10

 

 

#프로세스 메모리 구조

  • Code 영역 (= Text영역)
    실행할 프로그램의 코드가 저장되는 영역. CPU는 이 영역에서 명령어를 하나씩 가져와 처리
  • Data 영역
    전역 변수와 정적 변수가 저장되는 영역. 이 변수들은 프로그램이 시작될 때 할당되어 프로그램 종료 시 소멸
  • Stack 영역
    지역변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역.
    함수 호출 시 할당되고 함수 반환 시 소멸, 로드할 때(컴파일 타임) 크기가 결정된다. 

-> 위 세 영역은 컴파일할 때 data, stack 영역의 크기를 계산하여 메모리 영역이 결정된다. 

 

  • Heap 영역
    동적 데이터 영역 - 모리 주소 값에 의해서만 참조되고 사용되는 영역.

-> 프로그램 동작 시(런타임)에 크기가 결정된다.

 

https://velog.io/@cchloe2311/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

 

[운영체제] 프로세스 메모리 구조

시스템은 프로그램을 실행할 때 해당 프로그램을 메모리에 로드합니다. 그 메모리 구조에 대해 알아보겠습니다!실행되고 있는 프로그램으로, 프로세스는 각 메모리 공간을 시스템으로부터 할

velog.io

 

 

#스택프레임

: 스택 영역에 차례대로 저장되는 함수의 호출 정보 

함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소 값(return address), 함수에서 선언된 지역 변수 등이 저장됨 + 이전 프레임 포인터 ( saved frame pointer / old frame pointer ) ; 최상단 스택 프레임에서 바로 이전 단계의 스택 프레임의 시작점으로 이동할 때 필요한 주소 값

-> 스택 프레임 덕분에 함수의 호출이 모두 끝난 뒤에, 해당 함수가 호출되기 이전 상태로 되돌아갈 수 있다. 

http://tcpschool.com/c/c_memory_stackframe

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

 


 

 

 

 

2. CTF를 위한 Linux basics

2-1. I/O

#what is xineted? 

: xinetd(extended Internet daemon) : 오픈 소스 슈퍼 서버 데몬(많은 유닉스 계열 시스템에서 돌아감) - 인터넷 기반 연결을 관리한다. 

 

기본 설정 파일 : /etc/xinetd.conf

서비스들의 설정  :  /etc/xinetd.d 디렉터리에 저장됨

 

슈퍼 데몬 ??

네트워크 서버/클라이언트 구조에서 다양한 서비스( FTP, Telnet, SSH 등등 )의 서버 프로세스(데몬) 동작 방식의 공통점 : 실제 서비스를 제공하는 서비스 프로세스를 제외하고는 클라이언트의 접속 요청이 있을 때까지 대기하다가,
요청이 들어오면 해당 요청을 처리할 서비스 프로세스(자식 프로세스)를 실행하는 형태
==>  따라서 효율적인 서버 자원의 활용이라는 측면에서 공통적인 부분을 처리하는 슈퍼 데몬을 만듦 -> 개별 서비스를 등록 -> 클라이언트 요청은 슈퍼 데몬이 모두 처리 && 개별 서비스를 호출해주는 방식 등장

https://nevertrustbrutus.tistory.com/86

 

[Linux] 슈퍼데몬(xinetd) 이란? , 설치 방법

1. 슈퍼 데몬? standalone 방식 vs xinetd 방식 - 네트워크 서버/클라이언트 구조에서 다양한 서비스( FTP, Telnet, SSH 등등 ) 서버 프로세스(데몬) 동작 방식은 공통점이 있습니다. 실제 서비스를 제공하는

nevertrustbrutus.tistory.com


#redirection?

 

리눅스에서 프로그램은 보통 세 개의 파일 서술사를 열게 된다. 

[표준 입력(standard input, STDIN), 표준 출력(standard output, STDOUT), 표준 에러(standard error, STDERR) ]

순서대로 파일 디스크립터(fild descriptor)는 0, 1, 2

 

-> 리다이렉션은(Redirection) 이러한 파일 서술자 중 하나 이상을 파일로 다시 지정하는 수단 

 

 

> file
표준 출력(1)을 파일로 재지향
파일이 없으면 새로 만들고, 파일이 있으면 덮어쓴다.


>> file
표준 출력(1)을 파일로 재지향
파일이 없으면 새로 만들고, 파일이 있으면 파일의 끝에 덧붙인다.


2>&1
표준 에러(2)를 표준 출력으로 재지향
표준 에러도 표준 출력의 자격으로 보내진다. 


< file
파일로부터 표준 입력(0)을 받도록 재지향

 

[ex]

 ls -l aaa.txt > list_aaals -l aaa.txt 1> list_aaa와 같이 동작합니다. 여기서 숫자 1은 표줄 출력(stdout)을 의미함!! 

 

# ls -l aaa.txt 2> list_aaa  //2(표준 에러)가 리다이렉션 되어 list_aaa 파일의 내용으로 전달


# ls < aaa.txt //ls에 aaa.txt의 내용을 표준 입력으로 받기

 

 

https://gracefulprograming.tistory.com/100

 

[Linux] 재지향(Redirection)에 대한 이해

안녕하세요 피터입니다. 오늘은 리눅스의 I/O 재지향(redirection)에 대해서 설명드리겠습니다. 재지향은 파이프(pipe)와 더불어 리눅스의 명령어들을 훨씬 강력하게 무장시켜주는 역할을 하는 핵심

gracefulprograming.tistory.com

https://reakwon.tistory.com/115

 

[리눅스] 재지정, 리다이렉션(redirection: >, <)과 파이프(|) 개념과 쉬운 설명

재지정(Redirection) 리눅스에서 프로그램은 보통 세 개의 파일 서술사를 열게 됩니다. 바로 표준 입력(standard input, STDIN), 표준 출력(standard output, STDOUT), 그리고 표준 에러(standard error, STDERR)..

reakwon.tistory.com

 


#pipe, socket, tty

-pipe 

[명령어의 입력 - 실행 - 결과]의 과정에서 첫 번째 명령어 파이프의 결과를 화면으로 출력하는 대신 다른 명령어 파이프로 흘러가도록 연결하는 역할

 

#cat /etc/passwd | grep mail //현재 시스템의 계정 정보를 표준 출력 + mail이라는 문자열이 들어간 라인만 필터링하여 출력 
-> 파이프( | )를 사용하여 cat 명령어의 결과를 grep 명령어로 전달할 수 있습니다.
+) 쉘 프롬프트(Shell prompt)에서 한 번에 사용 가능한 파이프의 개수 제한 없음!! 

https://gracefulprograming.tistory.com/92

 

[Linux] 파이프(pipe)에 대한 이해

개요 안녕하세요 피터입니다. 오늘은 리눅스의 파이프(pipe)에 대해서 설명드리겠습니다. 파이프는 재지향(redirection)과 더불어 리눅스의 명령어들을 훨씬 강력하게 무장시켜주는 역할을 하는 

gracefulprograming.tistory.com

 

 

 

 

-socket 

네트워크 통신을 하는 표준 방법으로 프로세스 간 연결의 종점

+) 소켓 통신에 필요한 주요 함수는 아래 링크 참조! 

https://reakwon.tistory.com/81

 

[리눅스] 소켓(socket) 개념과 예제(connect, bind, listen, accept,send,recv 사용)

소켓(socket) 네트워크 통신을 하는 표준 방법으로 프로세스간 연결의 종점이라고 볼 수 있습니다. 기본적인 개념은 아래의 그림과 같습니다. 위의 그림은 TCP/IP에서의 인터넷 통신을 보여줍니다.

reakwon.tistory.com

 

 

 

-tty

콘솔 : 컴퓨터를 조작할 때 사용하는 입출력 장치 (명령 조작에 사용하는 애플리케이션이나 OS 자체)

-> 터미널 : 콘솔의 한 종류로 UI(Ctrl+Alt+T)로 사용할 수 있게 해주는 GUI(Graphic user interface) 프로그램이다. 일반적으로 키보드와 디스플레이로 구성됨


->TTY : 콘솔의 한 종류로 [Ctrl]-[Alt]-[F1 ~ F6] 키조합으로 사용 가능한 (OS에서 제공하는) 가상 콘솔.

실제 물리적인 장치가 연결된 것이 아니기 때문에 커널에서 터미널을 emulation 함. 

백그라운드 getty 프로세스에 의해 login prompt 가 제공된다.  /dev/tty[번호] 파일이 사용된다. 


https://booolean.tistory.com/666

 

Linux - 콘솔, 터미널, TTY 이해하기

Linux - 콘솔, 터미널, TTY 이해하기 콘솔, 터미널, tty는 서로 깊은 연관을 갖고 있는데 본래 이것들은 컴퓨터와 상호작용을 위한 장비를 뜻한다. unix시스템의 기본적인 이용방법은 unix가 인스톨된

booolean.tistory.com

https://mug896.github.io/bash-shell/tty.html

 

TTY | Introduction

TTY 컴퓨터는 기본적으로 연산을 위한 입력장치와 출력장치를 가집니다. 지금은 기술이 좋아져서 노트북같은 경우 연산장치, 디스플레이 출력장치, 키보드 입력장치가 모두 같이 있지만 초기에

mug896.github.io


#stdin, stdout, stderr

 

  • 표준 입력(stdin) = 0
  • 표준 출력(stdout) = 1
  • 표준 에러(stderr) = 2

 

#named pipe, domain socket

-named pipe

파이프( | )를 이용해 명령들을 연결하여 사용하거나 명령, 프로세스 치환을 사용하면, 명령 실행 중에 자동으로 pipe 가 생성되어 사용된 후 사라짐

-> 이때 생성되는 파이프를 이름이 없다고 해서 unnamed pipe 또는 anonymous pipe라고 한다.

 

이에 반해 named pipe는 직접 파이프를 파일로 만들어 사용!

shell에서 IPC (Inter Process Communication) 이 필요할 때 활용 가능하다. 

named pipe는 파일과 동일하게 사용될 수 있는데, 파일과 다른 점?? 

▣ redirection을 이용해 데이터를 출력했을 때 - 파일은 데이터를 저장하는 반면,pipe는 저장하지 않는다. 

=> 만약에 디스크 용량이 부족한 상태에서 용량이 큰 파일을 다루고자 할 때?? 

pipe를 이용하면 프로세스 중간에 임시파일을 만들지 않아도 되므로 디스크 사용을 피할 수 있다. 

 

▣ pipe는 데이터를 저장하지 않기 때문에 파일 내용을 random access 불가능.

-->  파일을 open 한 후에는 처음부터 끝까지 한 번에 읽거나 써야 한다. 

 

$ mkfifo /tmp/mypipe # 또는 mknod /tmp/mypipe p $ gzip --stdout -d dbfile.gz > /tmp/mypipe

다음은 mysql 프롬프트 상에서 실행하는 명령
#mysql> LOAD DATA INFILE '/tmp/mypipe' INTO TABLE tableName;

// gzip으로 압축돼 있는 mysql 데이터 파일을 압축 해제하여 mypipe로 출력하고 mysql 프롬프트 상에서 named pipe를 이용해 테이블에 로드하는 예

 

 

 

 

 

-domain socket

 

named pipe의 경우 프로세스 A 가 파이프에 값을 쓰면 프로세스 B 가 값을 읽을 수 있고,  프로세스 B 가 파이프에 값을 쓰면 프로세스 A 가 값을 읽을 수 있다. 

-> 이것은 양방향 통신이 가능한 것처럼 보이지만, 프로세스 A 가 값을 쓴 후에 다시 자신이 파이프를 읽으면?? 

값이 읽힌 이후에는 프로세스 B는 값을 읽을 수 없다. 

 

unix domain socket 은 named pipe와 같이 디렉터리에 socket 파일을 만들어서 시스템 내의 프로세스와 통신을 한다. 

-> 이때 생성되는 socket 파일은 다른 프로세스가 접속할 때 사용하는 ip 주소와 같은 역할 !! 

커널이 교통정리를 해주므로 socket에 연결된 하나의 FD 만으로도 양방향 통신 가능!! 

 

==> UNIX domain socket은 일반적으로 named pipe 보다 유연하다! 

  • 둘 이상의 프로세스 통신 가능
    (예: 여러 클라이언트 프로세스가 연결될 가능성이 있는 서버 프로세스)
  • 양방향 
  • 프로세스 간에 커널 확인 UID/GID 자격 증명 전달 지원
  • 프로세스 간에 파일 설명자 전달 지원 
  • 패킷 및 순차 패킷 모드를 지원

이러한 많은 기능을 사용하려면, 당신은 사용할 필요가 send()/의 recv() 시스템 호출보다는 가족 write()/을 read().

https://mug896.github.io/bash-shell/named_pipe.html

 

Named Pipe | Introduction

Named Pipe | 파이프를 이용해 명령들을 연결하여 사용하거나 명령, 프로세스 치환을 사용하면 명령 실행 중에 자동으로 pipe 가 생성되어 사용된 후 사라지게 되는데요. 이때 생성되는 파이프를 이

mug896.github.io


#buffering

 

입/출력에 사용되는 read, write 시스템 콜은 기본적으로 버퍼를 사용하지 않는다( unbuffered ).

->매번 read, write 이 발생할 때마다 시스템 콜을 사용하는 것X

-> 데이터를 메모리(버퍼)에 읽어 두었다가 read가 발생하면 메모리에서 전달함

쓰기를 할 때는 버퍼가 찰 때까지 저장했다가 한 번에 쓰기를 하는 것 O (->효율적임)


데이터를 입력받고 연산 결과를 출력하는데 stream을 이용하는 명령들은 내부적으로 버퍼를 이용 ( grep, sed, awk...).

명령 실행이 바로 종료되면 버퍼에 있던 내용도 모두 출력되므로 문제가 없지만, 

프로세스가 종료되지 않은 상태에서 출력을 지속한다면?? 버퍼와 관련해서 문제가 생길 수 있다. 

 

 

프로세스 A 가 logfile에 로그를 append 하면 tail 명령으로 실시간으로 데이터를 추출해서 프린트하는 명령

-> 실행해보면 정상적으로 동작 X

프로세스 A 가 ERR 로그를 logfile에 append 했으므로 파일에는 로그가 존재함에도 불구하고, 

grep, awk 명령을 거치면서 출력이 되지 않음. 나중에 로그가 쌓여서 출력할 데이터가 4096 bytes(page 크기)가 되면, 그때 한 번에 출력됨!! 

 

https://mug896.github.io/bash-shell/buffering.html

 

Buffering | Introduction

Buffering 입, 출력에 사용되는 read, write 시스템 콜은 기본적으로 버퍼를 사용하지 않습니다 ( unbuffered ). 따라서 매번 read, write 이 발생할 때마다 시스템 콜을 사용하기보다는 데이터를 메모리( 버

mug896.github.io


2-2. Memory Layout

#page, segment 

페이징(Paging)

  • 논리(가상) 메모리는 페이지(Page)이라 불리는 고정 크기의 블록으로 나누어짐
    물리 메모리는 프레임(Frame)이라 불리는 블록으로 나누어짐 ;  페이지과 같은 크기의 블록
    (보조 메모리 역시 프레임과 같은 크기의 블록들로 나누어짐)
  • 사용자는 하나의 주소를 지정(하드웨어의 의해 페이지 번호와 변위로 분할)
  • 페이지 테이블 - 각 페이지 번호  + 그에 해당하는 프레임의 시작 물리 주소를 저장
  • 항상 프레임의 정수 배로 할당되는데, 이때 프로세스가 페이지 경계와 일치하지 않는 크기의 메모리를 요구하게 되면,
    마지막 페이지 프레임은 전부 사용되지 않고 남아버리는 문제가 발생한다.(내부 단편화)

세그먼테이션(Segmentation)

  • 페이징에서처럼 논리 메모리와 물리 메모리를 같은 크기의 블록이 아닌, 서로 다른 크기의 논리적 단위인 세그먼트(Segment)로 분할
  • 사용자가 두 개의 주소로 지정(세그먼트 번호 + 변위)
  • 세그먼트 테이블 - 각 세그먼트의 기준(세그먼트의 시작 물리 주소) + 한계(세그먼트의 길이)를 저장
  • 서로 다른 크기의 세그먼트들이 메모리에 적재되고 제거되는 일이 반복되다 보면,
    자유 공간들이 많은 수의 작은 조각들로 나누어져 못 쓰게 될 수도 있다.(외부 단편화)

https://jupiny.com/2017/03/28/paging-segmentation/

 

페이징(Paging)과 세그멘테이션(Segmentation)비교

페이징(Paging) 논리(가상) 메모리는 페이지(Page)이라 불리는 고정 크기의 블록으로 나누어지고, 물리 메모리는 프레임(Frame)라 불리는 페이지과 같은 크기의 블록들로 나누어짐. 보조 메모리 역시

jupiny.com

 

 

+) 보충 자료 - 참고!! 

https://spacefordeveloper.tistory.com/174

 

페이징과 세그멘테이션

Paging vs Segmentation 가상 메모리를 관리하는 기법 가상 메모리 는 메모리에 로드된 즉, 실행중인 프로세스가 가상의 공간을 참조하여 마치 커다란 물리 메모리를 갖고 있는 것처럼 사용할 수 있도

spacefordeveloper.tistory.com


#kernel/user split

  • 유저 영역(user space) : 프로그램이 동작하기 위해 사용되는 메모리 공간(stack, heap, bss, data, text 영역)
  • 커널 영역(kernel space) : 운영체제를 실행시키기 위해 필요한 메모리 공간

https://jiravvit.tistory.com/entry/linux-kernel-1-%EC%BB%A4%EB%84%90kernel%EC%9D%B4%EB%9E%80-1

 

[linux kernel] (1) - 커널(kernel)이란?

1. 커널의 특징 및 개념, 이론, 부트로더 등 1-1. 커널이란? 운영체제를 사용자의 관점 혹은 시스템의 관점에서 살펴보자. 사용자의 관점에서 운영체제는, 컴퓨터를 사람이 사용하게 쉽게 여러가

jiravvit.tistory.com


#stack, heap, BSS, code segments(VMA)

 

스택 세그먼트 : 프로그램을 임시로 저장할 필요가 있거나, 사용자의 피호출 서브루틴(called subroutine)이 사용할 데이터와 주소를 포함한다. 

 

힙 세그먼트 : 동적으로 할당된 메모리를 포함하고 있다. (일반적으로 BSS 세그먼트의 끝에서 시작한다) 

 

BSS 세그먼트 : 초기화되지 않은 정적 데이터, 변수와 상수를 모두 포함한다.

전역 변수, 0으로 초기화되거나 소스 코드에서 명시적으로 초기화되지 않은 지역 정적 변수.

 

코드 세그먼트 : 텍스트 세그먼트라고도 한다. 실행될 기계 명령어 포함한다. 
보통 첫 번째로 실행 가능한 명령어는 이 세그먼트의 맨 처음에 위치함. -> 운영체제가 프로그램 실행 시작을 위해 그 위치를 알고 있다.

일반적으로 읽기 전용이고 크기가 고정되어 있다. !! 

 

데이터 세그먼트 : 프로그램에서 정의된 데이터, 상수, 작업 영역을 포함한다. 

 

https://en.wikipedia.org/wiki/Data_segment

 

Data segment - Wikipedia

In computing, a data segment (often denoted .data) is a portion of an object file or the corresponding address space of a program that contains initialized static variables, that is, global variables and static local variables. The size of this segment is

en.wikipedia.org

https://karfn84.tistory.com/18

 

[어셈블리] 세그먼트(segment)란?

세그먼트(segment) -  세그먼트는 프로그램에 정의된 특정 영역으로, 코드, 데이터, 그리고 스택(stack)으로 알려져 있는 것을 포함한다. 한 세그먼트는 패러그래프 경계(paragraph boundary), 즉 16또는 hex

karfn84.tistory.com


#VDSO, vsyscall

 

vsyscall 또는 virtual system call : 

특정 시스템 호출의 실행을 가속화하도록 설계된 메커니즘 - Linux 커널에서 최초이자 가장 오래된 메커니즘

->vsyscall 개념의 작동 원리?

Linux 커널은 일부 변수와 일부 시스템 호출 구현이 포함된 페이지를 사용자 공간에 매핑한다. 

 

 

vsyscall은 vDSO 또는 virtual dynamic shared object로 대체 : 

vsyscall과 vDSO 메커니즘의 주된 차이점??

vDSO는 메모리 페이지를 공유 객체 form각 프로세스에 매핑

vsyscall은 메모리에서 정적이며 매번 같은 주소를 가짐

(glibc에 동적으로 연결되는 모든 사용자 공간 응용 프로그램은 vDSO를 자동으로 사용 )

 

https://junsoolee.gitbook.io/linux-insides-ko/summary/syscall/linux-syscall-3

 

vsyscall and vDSO - linux-insides-ko

vdso_image 구조체의 이름에서 알 수 있듯이 시스템 콜 엔트리의 특정 모드에 대한 vDSO 이미지를 나타냅니다. 이 구조체는 항상 PAGE_SIZE (4096 바이트)의 배수인 vDSO 영역의 바이트 사이즈에 대한 정보

junsoolee.gitbook.io


#Libc 등 기타 라이브러리

libc == C 표준 라이브러

위치 - 우분투 : /lib

 

libc.so.6 : libc의 중심이 되는 파일

GNU lib  : 리눅스에서 보통 사용되는 libc , 약칭 glibc 

 

https://athena7.tistory.com/entry/linux-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-libc%EB%9E%80

 

linux 프로그래밍 - libc란?

C 표준 라이브러리 ( C standard library ) 약칭 libc 위치 우분투 : /lib CentOS : /lib64 libc.so.6 : libc의 중심이 되는 파일 GNU lib : 리눅스에서 보통 사용되는 libc , 약칭 glibc 만드는 사람 리눅스 커널..

athena7.tistory.com

+) 보충 자료 - 참고!! 

https://ko.wikipedia.org/wiki/C_%ED%91%9C%EC%A4%80_%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC

 

C 표준 라이브러리 - 위키백과, 우리 모두의 백과사전

C 표준 라이브러리(C standard library)는 C 언어를 위한 표준 라이브러리로서, ANSI C 표준에 의해 명시되었다.[1] 이것은 상위 집합인 C POSIX 라이브러리와 동시에 개발되었다.[2][3] ANSI C가 국제 표준화

ko.wikipedia.org

https://d4m0n.tistory.com/119

 

[Linux] 다른 버전의 Libc로 바이너리 실행 (run a program with another libc)

CTF에서 Pwnable 문제(remote)를 풀 때 간혹 libc도 같이 주어지는데, 이는 문제 서버에서 사용하는 libc version과 참가자들이 사용하는 libc의 버전이 다르기 때문에 문제 풀이에 참고하라고 주어지는 것

d4m0n.tistory.com

 


2-3. Dynamic Linking

#dll, so

 

#PLT, GOT

 

#PIE, relro

 

#ld-linux.so

 

#linkmap

 

#ret2dl? 

 

2-4. Kernel

#ring0

 

#System call 

 

#Addr_limit

 

#return 2 User

 

#Kptr_restrict

 

#SMEP/SMAP