전체 글 94

하드웨어 2차시 과제

CPU 기본 구조 CPU구조는 아키텍처마다 다 다르다. 표기법도 OS마다 약간씩 다르다. CPU는 크게 CU(Control Unit), ALU(Arithmetic-Logic Unit), Register Set으로 나눌 수 있다. ALU는 각종 산술 연산과 논리 연산을 수행하는 하드웨어 모듈이다. Register set은 레지스터(register)의 집합이다. 레지스터는 CPU 내부의 기억 장치로서, CPU가 동작하면서 사용하는 기억장치이다. 기억 장치 중에 가장 액세스 속도가 빠르다. CU는 프로그램 코드(명령어)를 해석하고 제어 신호를 발생시키는 하드웨어 모듈이다. ISA(Instruction Set Architecture)에 따라 구조가 달라진다. ISA는 컴퓨터가 실행할 수 있는 명령의 집합이다. ..

하드웨어 1차시 과제

ROM : Read Only Memory로 말그대로 읽기만 가능한 메모리를 뜻한다. 일반적으로 전원이 공급되지 않아도 데이터가 삭제되지 않고 반영구적으로 보존이 가능하기에 비휘발성(nonvolatile) 메모리라고도 한다. 일반적으로는 한번 데이터를 기록하면 더이상 수정이 불가능하기에, 바뀔 가능성이 거의 없는 BIOS같은 소프트웨어들이 이 ROM에 저장된다. 일부 특수한 종류의 ROM은 데이터를 변경하거나 쓸 수 있다. 또한 ROM이라고해서 Random Access가 안되는 것은 아니다. 실제로 대부분의 ROM은 랜덤하게 엑세스된다. 당연히 쓰기는 대부분 안된다. ROM은 여러가지로 분류할 수 있다. MROM, PROM, EPORM, EEPROM, FLASH 등이 여기에 속한다. FLASH같은 경우는 ..

flask

기본적인 코드다. 1 2 3 4 5 from flask import * app = Flask(__name__) @app.route('/', methods=['GET','POST']) def index(): return "hello" cs 메소드를 지정해줄 수 있고, html 코드를 리턴해줄 수 있다. 1 2 3 4 5 from flask import * app = Flask(__name__) @app.route('/', methods=['GET','POST']) def index(): return render_template('index.html') cs templates 경로가 디폴트라서 거기 기준으로 index.html을 리턴해줄 수도 있다. 1 2 3 4 5 6 7 8 from flask impor..

JS weather api, fetch api

https://openweathermap.org/api Weather API - OpenWeatherMap Please, sign up to use our fast and easy-to-work weather APIs. As a start to use OpenWeather products, we recommend our One Call API 3.0. For more functionality, please consider our products, which are included in professional collections. openweathermap.org 에 접속해서 로그인을 해준 뒤 프로필에 들어가서 api key를 복사해준다. API call에 이렇게 나와있다. https://api.open..

execve 시스템 콜과 쉘 코드 작성 및 추출

execve를 사용해서 쉘 코드를 만들어보겠다. execve 시스템콜이다. rax, rdi, rsi, rdx순서다. 기본적으로 execve를 쓸 때 커널은 filename을 통해서 파일을 열어준다. filename이 /bin/ls의 경우에는 뒤에 argv가 없으면 중단되어서 실행되지 않는다. 하지만 /bin/sh는 argv와 envp에 NULL을 넣어줘도 잘 동작한다. 그 이유에 대해서 찾아봤는데, 아래 글을 발견할 수 있었다. https://stackoverflow.com/questions/36673765/why-can-the-execve-system-call-run-bin-sh-without-any-argv-arguments-but-not Why can the execve system call run..

SYSTEM HACKING 2022.05.24

execve() argv 포인터 배열 확인

execve의 시스템 콜 표이다. 레지스터는 rax, rdi, rsi, rdx순이다. rax는 59, rdi에는 파일 이름의 포인터, rsi에는 argv 포인터 배열이 온다. rdx는 시스템 환경 변수가 담긴다는데, 스킵하겠다. execve함수도 어차피 내부적으로는 sys_execve로 구현이 되어있고, 파라미터도 똑같이 받아준다. /bin/ls를 통해서 한번 어떤 식으로 구현이 되는지 확인을 해보겠다. 다음과 같은 코드를 짜서 gdb로 까보겠다. 1 2 3 4 5 6 7 8 #include #include int main(){ char * arr[3]={"/bin//ls","-al",NULL}; execve(arr[0],arr,NULL); return 0; } cs argv[0]은 항상 자기 자신이 들..

프로그래밍/C 2022.05.24

C 함수 포인터, void 포인터 차이

C에서는 괄호 없이 함수를 적어줌으로써 함수의 주소 얻을 수 있다. 그리고 그 주소를 함수 포인터와 void 포인터에 넣을 수 있다. 하지만 int 같은 형을 가진 포인터들에 주소를 넣어주려 하면, 에러를 뱉어낸다. 기본적으로 주소에서 몇 바이트만큼 읽어올 것인지와 포인터에 대한 연산이 포인터의 형에 따라 달라지기 때문에 당연하다고 볼 수도 있다. 예를 들어서 int형 포인터는 +1 하면 4바이트씩 더해져서 읽어진다. void 포인터는 일반적으로 포인터 타입 캐스팅한 뒤에 사용된다. 함수 포인터와 void 포인터 둘다 함수의 주소를 넣어줄 수는 있지만 함수를 실행시키는 것은 함수 포인터만 가능하다. 내부적으로는 둘다 차이가 없는지 궁금해서 gdb로 뜯어보겠다. gcc -g -o C C.c로 컴파일해주고 ..

프로그래밍/C 2022.05.22

C 배열 포인터 array VS &array 차이, 디버깅을 통한 확인

1 2 3 4 5 6 7 #include int main(){ int arr[10]={1,2,3,4,5,6,}; printf("%p %p",arr,&arr); return 0; } cs 위와 같은 코드를 입력하고 돌려보면, 위와 같은 주소를 확인할 수 있다. 여기서 둘 다 같은 주소를 얻을 수 있으니, 같다고 생각하기 쉽다. 1 2 3 4 5 6 #include int main(){ int arr[10]={1,2,3,4,5,6,}; printf("%p %p",arr+1,&arr+1); return 0;} } cs 조금 수정해서 다시 돌려보면, 차이를 알 수 있다. 기본적으로 C언어에서 포인터에 연산을 해주면, 형에 따라서 가중치만큼 더하거나 빼준다. int형의 경우에는 +1을 하면 일반적으로 4바이트를 ..

프로그래밍/C 2022.05.22