일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Brute Force
- segmentation
- 완전탐색
- Deadlock
- exec
- 백준
- higunnew
- 삼성리서치
- 동기화문제
- 컴공복전
- 백트래킹
- 스케줄링
- 데드락
- 시뮬레이션
- 김건우
- BOJ
- paging
- BFS
- 알고리즘
- fork
- 운영체제
- ascii_easy
- 프로세스
- pwnable.kr
- samsung research
- dfs
- 가상메모리
- Memory Management
- 구현
- 삼성기출
- Today
- Total
목록분류 전체보기 (57)
gunnew의 잡설
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bm4v8k/btqCgSzgZYK/Y2E9XSYySYEeom78aNscNK/img.png)
2. Noncontiguous allocation (불연속 할당) - Paging 프로세스가 구성하는 주소 공간을 같은 크기의 Page로 잘라서 Page 단위로 물리적인 메모리로 올려놓거나 Backing store에 내려 두거나 하는 것이다. 프로세스의 주소 공간을 자른 것처럼 물리적인 메모리에 사용자 프로세스가 들어갈 수 있는 공간들도 페이지와 똑같은 크기로 잘라 놓는데 이 물리적 공간을 Page Frame(페이지 프레임)이라고 한다. 이 Page Frame은 페이지 하나가 올라갈 수 있다. 이 기법을 사용하면 hole들의 크기가 균일하지 않아 발생하는 문제, 즉, External fragmentation(외부 조각 문제)가 발생하지 않는다. 물론 Internal fragmentation(내부 조각 문..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Hwhvo/btqChF6YFHM/GK2oUDnGoBQwniQVbz8i21/img.png)
메모리에 접근하기 위해서는 주소가 필요하다. 주소에는 Logical address ( or Virtual address)와 Physical address가 있다. 프로세스가 만들어지면 독자적인 주소 공간 (Address space)가 만들어진다고 했는데 그때 사용되는 것이 논리적 주소이다. 또한 각 프로세스마다 0번지부터 시작하며 CPU는 이 주소를 활용한다. 반면 물리적 주소는 말 그대로 Memory에서 물리적으로 접근할 수 있는 주소로 메모리에 실제 올라가는 위치를 뜻한다. 결국 프로세스가 실행되기 위해서는 메모리에 프로세스가 올라가야 하고, 논리적 주소가 물리적 주소로 바뀌어 처리되어야 하는데 이것을 '주소 변환'이라 하며 '주소 바인딩'이라고도 한다. * Symbolic Address * 우리가 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dWjXJn/btqCgnlotue/1MnvFLESlt0SFj6K6f5Sr1/img.png)
제목은 도전기라고 썼는데 사실 그냥 팀원 한 분이랑 심심해서 나가보기로 했던 대회이다. 혹시 나가기를 고민하고 있다면 나가보는 것을 권한다. 문제를 이해만 한다면, 그리고 구현 능력이 조금이라도 있다면 아마 문제를 풀 수 있을 것이다. 푸는 것 자체는 어렵지 않다. 다만 어떻게 최적화를 하느냐에 따라 점수를 달리 얻을 뿐이다.. 이번 글은 심심하기도 하고 그냥 구글 해시코드에 대한 정보가 인터넷에 많지 않아서 한번 써보는 거임 대회는 일 년에 한 번 열리는데 Qualification Round가 있고 Final Round가 있다. Qualification Round는 집에서 볼 수도 있고 허브(Hub)에서 볼 수도 있지만 나는 우리 학교에 Hub가 있어 거기서 사람들과 다 같이 치렀다. 허브가 우리 나라..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/yYCMW/btqB7NX5iUU/Ri66Jxviepgzov9h2KneJ0/img.png)
이번 문제는 정말 어려웠다. 그래도 문제를 풀면서 나 스스로에게 조금은 뿌듯했던 점이 있다. 어느 정도 접근 법도 맞았고, 템빨이긴 하지만(peda를 써서 읭(?) 하는 부분이 있었음. 추후 설명) exploitation point도 캐치하였다는 점이다. 물론 아직 gdb를 능숙히 다룰 수 있는 실력이나 어셈블리 코드를 분석하는 능력은 부족하지만, 까막눈이었던 몇 주 전과 비교하면 꽤나 나아진 느낌이다. 일기는 여기서 그만 쓰고 처음부터 차근차근해보자. pdisas main 디스 어셈블리 코드를 보기 전, 한 가지 팁이 있다. 다음과 같이 디스 어셈블리 코드가 깨지는 경우 set print asm-demangle on 를 치면 깨끗해진다. ↓↓ gdb uaf * uaf.cpp * #include #inc..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Xr5Zt/btqB6iEessT/26RY29F8UedujUzF75wz01/img.png)
이번 문제도 결국 쉘 스크립트 명령어를 얼마나 잘 아느냐를 묻는 문제였다. 코드를 먼저 살펴보자. 먼저, delete_env()를 호출하여 이전에 설정된 환경 변수들을 모두 지운다. 그리고 filter() 함수를 통해서 실행 시 두 번째 인자로 =, PATH, export, /, `, flag를 사용할 수 없게 한다. 이전에 했던 python -c를 통한 payload 공격이라든가, 두 번째 인자로 새로이 환경 변수를 추가하여 공격하는 것을 방지한 모양이다. 나도 어떻게 할지 몰라 당황하던 중 검색을 통해 command라는 명령어를 알게 되었다. help command를 통해 살펴보자. cmd2@pwnable:~$ help command command: command [-pVv] command [arg ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cCxViX/btqB2IW884l/ArTNDDngSAVUFDtAzkIwT0/img.png)
이 문제는 환경 변수에 대해 제대로 이해하고 있는지를 묻는 문제이다. 먼저 코드를 살펴보자. 비교적 간단하다. putenv() 함수는 무엇인가? 이전에 우리는 환경 변수에 대해서 살펴본 바 있다. 환경 변수란 내가 어떤 경로에 있든지 상관 없이 스크립트를 짤 수 있게 도와준다. 예를 들어 우리가 자주 쓰는 cat이라는 flag는 /bin에 저장되어 있다. 그런데 만약 환경 변수가 없다면 우리가 cat을 실행할 때마다 항상 /bin/cat ~~ 이런 식으로 입력해야만 한다. 얼마나 불편한가! 그래서 이를 편리하게 하기 위해 사용되는 것이 환경 변수이다. 이 정도는 모두가 알고 있을 것이라 생각하고 바로 환경 변수를 env 명령어를 통해 살펴보자. PATH만 따로 놓고보니 다음과 같이 등록되어 있다. cmd..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cnGeHf/btqB5h5juUN/i0AB9oa1rosRxWoQTAIM00/img.png)
이번 문제도 너무 쉽다. 결국 취약점이 발견되는 곳은 play() 함수이다. submit에 우리가 직접 입력할 수 있으며, unsigned char lotto[6] 에 "/dev/urandom"을 통해 랜덤으로 문자를 입력한다. 자 그리고 문제가 되는 부분은 바로 이 부분이다. int match = 0, j = 0; for(i=0; i
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/kCZo7/btqB2IitVko/b89laoC2oP4U1svU9BOEi0/img.png)
음.. 이번 거는 좀 터무니가 없다. 이 사이트에 들어가서 소스 코드를 보다보면 betting() 함수가 나온다. 그런데 처음에 가진 돈보다 많이 걸면 다시 입력하라고 나온다. 그러나 이것은 반복문이 아니므로 이때 터무니 없이 높은 돈을 입력하면 그것이 베팅 머니가 된다. 이렇게 계속해서 걸다가 딱 한 번만 이기면 끝. 나도 4번 졌다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bdNTdV/btqB1HDOFmz/EfDAz99H4YYWu6B7QuprWK/img.png)
글 쓰다가 날아가서 화가 난다. 이번 글은 짧게 써야겠다. 별로 어렵지도 않다. nc pwnable.kr 9007로 접속하면 가짜 동전 찾기 게임이 나온다. 문제를 읽어보니 딱 봐도 이분 탐색(Parametric Search) 문제이다. 그런나 이 게임을 100번을 통과해야 하는데 제한 시간은 60초이다. 딱봐도 뭔가 Exploitation Code를 작성해서 해결해야 겠다는 생각이 들지 않는가? 사람 손으로 1분 안에 깬다는 것은 불가능하다. 1. Parametric Search 이분 탐색 코드이다. while문의 제한은 C번이다. left는 0, right는 N으로 시작하며 계속해서 범위를 절반으로 줄여 나간다. left = 0 right = N cnt = C mid = -1 while cnt != ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/qT7hu/btqB10v3QsA/KFc2JglHr3EEZoQdkqo4wk/img.png)
2. Deadlock Avoidance 이 방법은 어떤 추가적인 정보를 이용하여 데드락을 막는 방법이다. 이 추가적인 정보라 함은, 프로세스마다 자기 평생에 자원을 최대로 쓰면 얼마나 쓸지(자원 사용의 최대치)에 대한 정보이다. Deadlock Avoidance Algorithm은 두 종류가 있다. 첫 번째는 자원당 instance가 하나인 경우이고, 두 번째는 자원당 instance가 여러 개인 경우이다. 먼저 instance가 하나인 경우부터 살펴보자. * Single instance per resource types (Resource Allocation Graph Algorithm) * Deadlock Avoidance에서는 위 그래프에서 실선뿐만 아니라 점선도 둔다. 점선은 프로세스에서 자원으로 ..