본문 바로가기

시스템

(6)
7주차 시스템 실습에 사용될 코드는 다음과 같다.// Name: rao.c// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie#include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0);}void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL);}int main() { char buf[0x28]; init(); printf("Input: "); scanf("%s", buf); return 0;}분석취약점은 scanf("%s", buf)부분에 있다. 실수 또는..
5주차_시스템 SYSV리눅스는 SYSTEM V(SYSV) Application Binary Interface(ABI)를 기반으로 만들어졌다.SYSV에서 정의한 함수 호출 규약은 3가지 특징을 가진다. 6개의 인자를 RDI, RSI, RDX, RCX, R8, R9에 순서대로 저장하여 전달합니다. 더 많은 인자를 사용해야 할 때는 스택을 추가로 이용한다.Caller에서 인자 전달에 사용된 스택을 정리한다.함수의 반환 값은 RAX로 전달한다.// Name: sysv.c// Compile: gcc -fno-asynchronous-unwind-tables -masm=intel \// -fno-omit-frame-pointer -S sysv.c -fno-pic -O0#define ull unsigned long ..
4주차_시스템 shellcraft방식을 사용해봅니다. 다른 방식은 조만간 추가하겠습니다... 드림핵의 서버와 포트번호, 플래그를 입력합나다. bombdisass phase_2를 해줍니다 read_six_number를 disass해봅니다처음 숫자는 1인데 2배씩 증가하는 걸 알 수 있습니다정수가 6개 필요하다는 것을 확인할 수 있다.성공하는 걸 볼 수 있다.
3주차_시스템 셸코드셸코드(Shellcode)는 익스플로잇을 위해 제작된 어셈블리 코드 조각다. 일반적으로 셸을 획득하기 위한 목적이다. /tmp/flag를 읽는 셸코드char buf[0x30];int fd = open("/tmp/flag", RD_ONLY, NULL);read(fd, buf, 0x30); write(1, buf, 0x30); syscallsyscallraxarg0(rdi)arg(rsi)arg(rdx)read0x00unsigned int fdchar *bufsize_t countwrite0x01unsigned int fdconst char *bufsize_t countopen0x02const char *filenameint flagsumode_t mode int fd = open(“/tmp/flag”,..
시스템 2주 x64 어셈블리 언어는 동사에 해당하는 명령어(Operation Code, Opcode)와 목적어에 해당하는 피연산자(Operand)로 구성됩니다.명령어들을 크게 분류하면 이렇습니다.  피연산자에는 3가지 종류가 올 수 있습니다. 상수, 레지스터, 메모리입니다. 메모리 피연산자는 []으로 둘러싸인 것으로 표현됩니다. 앞에 크기 지정자인 TYPE PTR이 추가될 수 있습니다. 타입에는 BYTE, WORD, DWORD, QWORD가 올 수 있으며 각각 1, 2, 4, 8바이트의 크기를 지정합니다.  데이터 이동 명령어는 어떤 값을 레지스터나 메모리에 옮기도록 지시한다. mov dst, src에 들어있는 값을 dst에 대입mov rdi, rsirsi의 값을 rdi에 대입mov QWORD PTR[rdi], rs..
시스템 1주 폰 노이만초기 컴퓨터 과학자 중 한 명이다. 노이만은 컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다고 생각했다. 근대의 컴퓨터는 연산과 제어를 위한 중앙처리장치, 저장을 위한 기억 장치, 장치간에 데이터나 제어 신호를 교환할 수 있도록 버스라는 전자 통로를 사용한다.  중앙처리장치CPU는 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌이다.   기억장치기억장치는 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용되며, 용도에 따라 주기억장치와 보조기억장치로 분류된다. 주기억장치로는 RAM이 있으며, 보조기억장치는 하드 드라이브(HDD), SSD가 있다. 버스버스는 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로를 말한다.  명령어 집합 구조CP..