일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- segmentation
- 삼성기출
- BFS
- pwnable.kr
- 운영체제
- 동기화문제
- 스케줄링
- dfs
- 알고리즘
- 프로세스
- BOJ
- 구현
- 데드락
- 컴공복전
- 백준
- 시뮬레이션
- exec
- 김건우
- paging
- 가상메모리
- 삼성리서치
- ascii_easy
- Deadlock
- samsung research
- 완전탐색
- Brute Force
- Memory Management
- higunnew
- 백트래킹
- fork
- Today
- Total
목록System Security (18)
gunnew의 잡설
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b7rqLM/btqBWrVDgOY/nv5St38lqNQjCYPeKdr14k/img.png)
어떻게 매번 모르는 개념만 나올 수 있을까. ARM assembly를 알아야만 풀 수 있는 문제이다. 뭐 이미 Intel assembly를 알고 있어서 어느 정도는 이해할 수는 있었으나 내가 알던 개념과 조금은 달랐다. 가령 PC register에는 다음 instruction이 아니라 다다음 instruction이 담겨있다는 것과 같은 것 말이다... 코드부터 보자. #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc, $1\n" "bx r6\n" ".code 16\n" "mov r3, pc\n" "add r3, $0x4\n" "push {r3}\n" "pop {pc}\n" ".code..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/czE4aR/btqBMNLyVog/4IcSBO8cl2THjSOgoSSihk/img.png)
아... 이번 거는 그냥 소스 코드 보자마자 포기했다. 리눅스로 소켓 입출력 문제가 나올 것이라 생각도 못했다. 그냥 바로 해설을 보러 갔다...(비루한 인생) 하지만 그래도 내가 공부하며 알게된 것들을 내 나름대로 풀어 써 보자. 0. input.c 살펴보기 #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the fl..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/WCPby/btqBM79NMTO/0JLo8CcvuTRwwGTL7W6Ls0/img.png)
이번 챕터는 너무 쉽다. library에 있는 rand 함수의 취약점을 이용하는 건데, rand()는 진짜 random이 아니라 pseudo-random number이다. 그러니까 seed가 동일하다면, 동일한 random sequence를 내놓는다. 코드부터 보자. random에 rand()를 호출하는데 seed는 0으로 언제나 똑같다. 그러면 seed가 0일 때 어떤 rand값을 산출하는지 확인해보면 1804289383으로 항상 같은 값을 산출하는 것을 볼 수 있다. 다시 코드로 돌아가서 random (XOR) key 가 0xdeadbeef가 되어야 한다. random은 1804289383으로 binary로 110 1011 1000 1011 0100 0101 0110 0111 이다. 그리고 0xdea..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/LpvmT/btqBJePpo2H/1F7cvKTNoEgKhmnHtt8Izk/img.png)
코드만 보고 개쉬울줄 알았다가 너무 어려워 해설을 찾아보았다. 역시나 이번에도 내가 모르는 개념을 마음껏 써 재껴야 풀리는 문제였다. 뭐 아무래도 좋다. 이러면서 배우는 거니까! 소스 코드 먼저 보자. 읽다 보면 이상한 점이 발견될 것이다. 바로 login()에서 scanf("%d", passcode1); ... scanf("%d", passcode2); 이다. scanf로 해당 변수에 값을 넣으려면 &를 붙여 주소를 입력해야 한다. 그런데 여기서는 그냥 변수 명을 넣어주었다. 잘 생각해보면, scanf는 두 번째 인자로 넘어온 부분의 '값'에 해당하는 '곳'에 입력된 것을 넣는다. 그러니까 두 번째 인자로 어떤 변수의 주소 '값'이 들어오면 거기에다가 입력된 값을 넣는다. 일단 이 점을 염두에 두고 g..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dgqV0v/btqBGq93RVZ/Ez1Y6ZfkxABvIb33opmpsK/img.png)
이번 문제는 뭘까... 두려움이 앞선다. 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를 찾아보았더..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/epHqpb/btqBG0iUSRj/ZmLAlkxRLKYZz0jK1ra8M1/img.png)
이 문제 풀다가 뇌가 정지되는 느낌을 너무 많이 받았다. 어셈블리를 거의 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..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bDe1YH/btqBE1pIxgJ/D9UHPBM59g7AUIuAKQKkQ0/img.png)
바로 문제로 들어가보자. unsigned long이라는 4bytes 공간에 0x21DD09EC가 저장되어 있다. 그리고 우리가 인자로 어떤 20bytes 짜리 문자열을 넘겨주면 그것을 int로 쪼개서 5번 더한 값이 0x21DD09EC가 되어야 한다. 쉽게 생각하자. 그러면 그냥 단순하게 4bytes씩 5개의 공간에 공평하게 같은 값이 들어가 있고 5로 나눈 나머지만 더하면 될 것 아닌가? 지금 해시코드가 0x21DD~ 이런 식이니까 어려울 수도 있는데 104라 해보자. 그러면 문제는 매우 쉬워진다. 각각이 20씩 가진 다음에 마지막에 4만 더하면 끝이다. 이것도 마찬가지이다. hashcode를 5로 나누어보자. 그러면 몫이 0x6C5CEC8이고 나머지는 4이다. 결국 우리는 6C5CEC8을 나타내는 문..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Jr8mQ/btqBGgsVB7Y/Mv6VAvnJ2oVMKkEd8PLhg0/img.png)
보안 스터디를 시작했다. 보안에 대해서는 아무것도 모르지만 어찌어찌 아는 분의 소개로 조그만 스터디에 들어가게 되었다. 아직 아는 것은 없지만 열심히 해보자! 역시 스터디의 맛은 문제를 푸는 것이지! 본 스터디는 pwnable.kr에 있는 문제를 중심으로 핵심 개념들을 검색하고 책을 찾아 공부해 나가며, 이외에 리눅스 커널과 관련 자료들을 바탕으로 주제를 정해 각자 발표해 나가는 방식으로 진행하기로 했다. 이에 앞서 fd에 대한 개념을 모른다면 File Descrioptor에 대한 내용을 숙지해야 한다. https://en.wikipedia.org/wiki/File_descriptor File descriptor - Wikipedia In Unix and related computer operating ..