일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ascii_easy
- 컴공복전
- 백준
- 동기화문제
- 데드락
- 삼성리서치
- paging
- dfs
- higunnew
- pwnable.kr
- 김건우
- 완전탐색
- 구현
- BFS
- 시뮬레이션
- Deadlock
- 운영체제
- Memory Management
- exec
- segmentation
- samsung research
- 가상메모리
- fork
- Brute Force
- BOJ
- 삼성기출
- 백트래킹
- 프로세스
- 알고리즘
- 스케줄링
- Today
- Total
목록전체 글 (57)
gunnew의 잡설

코드만 보고 개쉬울줄 알았다가 너무 어려워 해설을 찾아보았다. 역시나 이번에도 내가 모르는 개념을 마음껏 써 재껴야 풀리는 문제였다. 뭐 아무래도 좋다. 이러면서 배우는 거니까! 소스 코드 먼저 보자. 읽다 보면 이상한 점이 발견될 것이다. 바로 login()에서 scanf("%d", passcode1); ... scanf("%d", passcode2); 이다. scanf로 해당 변수에 값을 넣으려면 &를 붙여 주소를 입력해야 한다. 그런데 여기서는 그냥 변수 명을 넣어주었다. 잘 생각해보면, scanf는 두 번째 인자로 넘어온 부분의 '값'에 해당하는 '곳'에 입력된 것을 넣는다. 그러니까 두 번째 인자로 어떤 변수의 주소 '값'이 들어오면 거기에다가 입력된 값을 넣는다. 일단 이 점을 염두에 두고 g..

이번 문제는 뭘까... 두려움이 앞선다. Reverse engineering 인듯 하다. 어떻게 하는 건지는 잘 모르겠지만 우선 다음 명령어를 통해 파일을 다운받자. wget http://pwnable.kr/bin/flag 그리고 flag를 실행해보았더니 malloc을 했고, 거기에 flag를 strcpy 해 놓았단다. 그러면 이것도 뭐 gdb 겠거니 하면서 gdb를 켜보자. 1. gdb로 열어보기 띠용?? file을 열 수 없다고? 왜지? 흠... 그러면 한번 binary file을 열어보자. 2. UPX 다운로드 및 Unpacking 자 이제 기계어로 된 binary file인 flag를 vi로 읽어보자. 그랬더니 위의 괴상한 문자들이 나오는데 그 와중에 UPX라는 글자가 보인다. UPX를 찾아보았더..

이 문제 풀다가 뇌가 정지되는 느낌을 너무 많이 받았다. 어셈블리를 거의 1년 만에 뜯어보게 될 줄이야... 일단 gdb (GNU debugger) 사용법도 몰랐다. 아무튼 나에겐 너무 어려웠음. 우선 기본적으로 ./bof로 열리지 않는 문제가 발생한다. 이것은 bof 바이너리 파일이 32bit으로 작성되어 있고 우리 운영체제는 보통 64bit이기 때문이다. 아무튼 이거는 구글링으로 해결했으니 따라오도록 kimk@ubuntu:~/Desktop/security/bof$ file bof bof: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.6..

바로 문제로 들어가보자. unsigned long이라는 4bytes 공간에 0x21DD09EC가 저장되어 있다. 그리고 우리가 인자로 어떤 20bytes 짜리 문자열을 넘겨주면 그것을 int로 쪼개서 5번 더한 값이 0x21DD09EC가 되어야 한다. 쉽게 생각하자. 그러면 그냥 단순하게 4bytes씩 5개의 공간에 공평하게 같은 값이 들어가 있고 5로 나눈 나머지만 더하면 될 것 아닌가? 지금 해시코드가 0x21DD~ 이런 식이니까 어려울 수도 있는데 104라 해보자. 그러면 문제는 매우 쉬워진다. 각각이 20씩 가진 다음에 마지막에 4만 더하면 끝이다. 이것도 마찬가지이다. hashcode를 5로 나누어보자. 그러면 몫이 0x6C5CEC8이고 나머지는 4이다. 결국 우리는 6C5CEC8을 나타내는 문..

보안 스터디를 시작했다. 보안에 대해서는 아무것도 모르지만 어찌어찌 아는 분의 소개로 조그만 스터디에 들어가게 되었다. 아직 아는 것은 없지만 열심히 해보자! 역시 스터디의 맛은 문제를 푸는 것이지! 본 스터디는 pwnable.kr에 있는 문제를 중심으로 핵심 개념들을 검색하고 책을 찾아 공부해 나가며, 이외에 리눅스 커널과 관련 자료들을 바탕으로 주제를 정해 각자 발표해 나가는 방식으로 진행하기로 했다. 이에 앞서 fd에 대한 개념을 모른다면 File Descrioptor에 대한 내용을 숙지해야 한다. https://en.wikipedia.org/wiki/File_descriptor File descriptor - Wikipedia In Unix and related computer operating ..

PS 백준 소스 코드 모음 : https://github.com/kgw4073/Problem-Solving https://www.acmicpc.net/problem/17825 17825번: 주사위 윷놀이 첫째 줄에 주사위에서 나올 수 10개가 순서대로 주어진다. www.acmicpc.net 이 문제를 처음 풀기 시작했을 때 한 20분 동안은 멍했다. 분명히 완전 탐색인데 어떻게 '구현'하지? 뭔가 문제가 상당히 난잡해 보였다. 그도 그럴 것이 밑에 제시된 그림만 봐도 현기증 나게 생겼다. 이건 뭐 어쩌라는 거지... 20분은 그렇게 날렸다. 그러다가 실제 시험이라고 생각하니 정신이 들었다. 기존 문제처럼 정갈하게 연결 상태가 주어진 것도 아니고, 친절하게 그림으로 설명을 첨부해 주지도 않았다. 그러면 할..

프로세스 동기화를 설명하기에 앞서 컴퓨터 내부에서 연산이 이루어지면서 데이터에 접근하는 것이 어떻게 일어나는지 살펴보자. 다음 그림은 데이터의 접근이 일어나는 양상을 그림으로 나타낸 것이다. Race Condition(경쟁 상태에서 발생하는 문제, Concurrent access) 연산을 할 때는 항상 무언가를 읽어 들이고 그 결과를 내보내는 작업이 필요하다. 이때 같은 데이터를 한 곳이 아니라 여러 곳에서 읽어서 연산을 할 때 문제가 발생할 수 있다. 즉, 연산 주체가 둘 이상일 때 하나의 데이터를 가지고 접근하는 경우 문제가 발생할 수 있다. 다음 예시를 살펴보자. 여기서는 본래 count를 하나 증가시키고 나서 count를 감소시켜 값의 변화를 없게 하려고 한다. 그런데 만약 count의 값을 왼쪽..

Multi-level Queue 지금까지는 하나의 큐에 줄을 서는 것에 대해 이야기 했지만, 이번에 소개할 스케줄링 방법은 여러 큐를 통해 스케줄링하는 것이다. 이때 큐를 여러 갈래로 분류하는데 첫 번째로 Foreground queue이고 두 번째로 Background queue가 있다. Foreground queue에는 Interactive한 job들이 줄을 서고 Background queue에는 batch job – no human interaction job들이 줄을 선다. Multi-level Queue 스케줄링에서는 큐 내부에 프로세스 우선순위가 아니라 큐의 우선순위를 결정한다. 즉, ‘큐에 대한 스케줄링’이 필요하다는 것을 의미한다. 1. 첫 번째 방법으로 Foreground queue의 우선..

PS 백준 소스 코드 모음 : https://github.com/kgw4073/Problem-Solving https://www.acmicpc.net/problem/5373 5373번: 큐빙 문제 루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 3×3×3개의 작은 정육면체로 이루어져 있다. 퍼즐을 풀려면 각 면에 있는 아홉 개의 작은 정육면체의 색이 동일해야 한다. 큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있다. 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다. 이 문제에서는 루빅스 큐브가 모두 풀린 상태에서 시작한다. 윗 면은 흰색, 아랫 면은 노란 www.acmicpc.net 세상에 이런 무식한 문제가 있었다..

이번 강에서는 CPU 스케줄링 알고리즘에 대해 설명한다. 이를 설명하기에 앞서 스케줄링의 성능의 기준을 알아보자. CPU utilization (CPU 이용률)은 전체 시간 중에서 CPU가 놀지 않고 일한 시간의 비율을 의미한다. Throughput (처리량)은 단위 시간당 CPU의 처리량을 의미한다. CPU가 얼마나 많은 일을 했는가를 나타낸다. Turnaround time (소요 시간) 부터는 모두 시간과 관련된 것이다. Waiting time (대기 시간) Response time (응답 시간) 이 다섯 가지 기준을 쉬운 예시를 통해 살펴보자. 우리가 건물주가 되어 중국집을 차려서 중국집 주방장(CPU)을 고용한다고 가정하자. 우리로서는 주방장이 최대한 많은 시간 동안 일을 하는 것이 좋을 것이다...