2019/10
1475번 - 방 번호 python
1475번 - 방 번호 python
2019.10.221475번: 방 번호 첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수 또는 0이다. www.acmicpc.net #!/bin/python3 # prob 1475 # 6과 9는 특별한 경우 이므로 _ 로 치환 val = input("").replace('6','_').replace('9','_') # 0 ~ 9 숫자 세트 하나 구매 count = 1 sets = list() sets.append(['0','1','2','3','4','5','_','7','8','_']) # 여기도 역시 6과 9를 _로 치환 for num in val: check = 0 for c in range(0,count): # 구매한 숫자 세트 만큼 loop if num in sets[c]..
[BaekJoon] - 1193 분수찾기
[BaekJoon] - 1193 분수찾기
2019.10.141193번: 분수찾기 첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다. www.acmicpc.net 아래 표 처럼 번호 순서대로 규칙성을 가지고 있다. 1은 (1,1)로 시작하고, 2는 (1,2), 3은 (2,1), 4는 (3,1), 5는 (2,2)... 라고 필자는 좌표로 설정하고 코딩을 했다. 만약 사용자가 5라고 입력했을때, 출력되어야 하는 좌표는 (2,2) 이고 답은 2/2 이다. 1 > 5 1 + 2 > 5 1 + 2 + 3 > 5 1 + 2 + 3 일때 사용자가 입력한 값보다 처음으로 크므로, 이때 i=3이라고 하자. i가 홀수 일때는 (1,i)에서, 즉 6에서 x축으로 -1, y축으로 +1해서 5의 위치는 (1, i) + (1,-1) = (2,2) 라는 결과를 얻을 수 있다. 1..
[BaekJoon] - 10773 제로
[BaekJoon] - 10773 제로
2019.10.1310773번: 제로 문제 나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다. 재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다. 재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다. 재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자! 입력 첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ www.acmicpc.net if __name__ == "__main__": count = int(input("")) stack = list() while count > 0: val = int(input("")) if val == 0:..
[BaekJoon] - 10871 x보다 작은 수
[BaekJoon] - 10871 x보다 작은 수
2019.10.1310871번: X보다 작은 수 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다. www.acmicpc.net #!/bin/python3 # File name: poc.py if __name__ == "__main__": n, x = map(int, input("").split(" ")) number = input("").split(" ") result = list() for i in number: if x > int(i): result.append(i) print(" ".join(result))
[jquery] - this를 이용한 코드 중복 방지
[jquery] - this를 이용한 코드 중복 방지
2019.10.12jquery 사용시 같은 class나 id를 가진 태그가 예를들어 클릭이 되었을때 각 상황에 맞는 함수를 실행하려고 한다면 비효율적으로 작성 할 수도 있다. 하지만 this 를 사용하면 코드의 길이와 중복을 피할 수 있다. 아래 코드를 예로 들어 설명하겠다. Security web system hack server webhack 우선 서브 카테고리를 숨기고 메인 카테고리를 클릭했을 때, 그에 해당하는 서브 카테고리를 펼치거나 접어보려고 한다. 하지만 main class는 2개이기 때문에 각각의 상황에 맞는 코드를 중복하여 사용하기에는 똑같은 동작을 하는 코드가 중복이 되어 버린다. 이때 this를 사용하면 간단해진다. Security web system hack server webhack this 를 사..
[jquery] - 카테고리 펼치기 접기 만들기
[jquery] - 카테고리 펼치기 접기 만들기
2019.10.12카테고리가 많을때 세로로 길게 나열된 것을 보면 보기 싫을때가 있다. jquery를 이용해 메인 카테고리를 기준으로 접고 펼칠 수 있다. 아래 코드를 기준으로 시작하겠다. test test1 test2 서브 카테고리가 일단 보이지 않아야 하기 때문에 sub class에 style을 아래와 같이 추가한다. test test1 test2 그리고 main 을 클릭했을때, 서브 카테고리가 보이게끔 아래와 같이 jquery를 작성해준다. main을 클릭할시 sub가 웹 페이지에 보일시( is(":visible") ), css() 함수로 display 속성을 none으로 바꾼다. sub가 웹 페이지에 보이지 않을 시, css() 함수로 display 속성을 block으로 바꾼다. test test1 test2 이를..
[BaekJoon] - 10936 base64 디코딩
[BaekJoon] - 10936 base64 디코딩
2019.10.1210936번: BASE64 디코딩 첫째 줄에 문자열 S를 BASE64로 인코딩한 결과가 주어진다. S는 알파벳 대문자와 소문자, 그리고 숫자로만 이루어져 있으며, 길이는 최대 50이다. www.acmicpc.net #!/bin/python3 # base64 디코딩 import string BIT = 8 if __name__ == "__main__": table = string.ascii_uppercase + string.ascii_lowercase + string.digits + "+/" b64_table = dict() count = 0 # Create base64 Table for char in table: b64_table[char] = str(count) count += 1 # Input ciph..
[BaekJoon] - 10935 base64 인코딩
[BaekJoon] - 10935 base64 인코딩
2019.10.1210935번: BASE64 인코딩 첫째 줄에 문자열 S가 주어진다. S는 알파벳 대문자와 소문자, 그리고 숫자로만 이루어져 있으며, 길이는 최대 50이다. www.acmicpc.net #!/bin/python3 # base64 인코딩 import string BIT = 6 def padding(binary): return binary + '0' * (BIT - len(binary) % 6) if __name__ == "__main__": b64_table = dict() count = 0 for char in string.ascii_uppercase + string.ascii_lowercase + string.digits + "+/": b64_table[str(count)] = char count += ..
[BaekJoon] - 10845 큐
[BaekJoon] - 10845 큐
2019.10.1210845번: 큐 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다. www.acmicpc.net #!/bin/python3 def pop(q): if len(q): return q.pop(0) else: return -1 def size(q): return len(q) def empty(q): if len(q): return 0 else: return 1 def front(q): if len(q): return q[0] else: return -1 def back(q): if len(q): return q[..
[BaekJoon] - 10828 스택
[BaekJoon] - 10828 스택
2019.10.1210828번: 스택 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다. www.acmicpc.net #!/bin/python3 def top(stack): if len(stack): return stack[::-1][0] else: return -1 def size(stack): return len(stack) def empty(stack): if len(stack) == 0: return 1 else: return 0 def pop(stack): if len(stack): return stack.pop() ..
[BaekJoon] 1158번 조세퍼스 문제
[BaekJoon] 1158번 조세퍼스 문제
2019.10.101158번: 조세퍼스 문제 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000) www.acmicpc.net 2개의 언어(python, c)로 위 문제를 풀었다. python은 그냥 slicing으로 문제를 풀었다. #!/bin/python3 # poc.py def play(node, person, rule): result = list() while person > 0: result.append(node[(rule-1)%len(node)]) node = node[node.index(result[::-1][0])+1:] + node[:node.index(result[::-1][0])] person -= 1 print("") if __name__ == "__mai..
[thehackernews] - 안드로이드 폰에 영향을 줄 새로운 제로데이 취약점
[thehackernews] - 안드로이드 폰에 영향을 줄 새로운 제로데이 취약점
2019.10.07안드로이드 제로데이 취약점은 이스라엘 NSO 그룹(정부나 개인에게 제로데이 익스플로잇을 판매하는 것으로 유명한 그룹)이 타켓의 안드로이드 디바이스를 제어하기위해 악용된 것으로 발견되었다. Project Zero 연구로 의해 발견되었고, CVE-2019-2215라고 불리는 매우 심각한 보안 취약점에 대한 세부 내용과 개념 증명 악용은 안드로이드 보안 팀에게 그것을 보고한 7일 뒤 공개적으로 오늘 만들어 졌다. 제로데이는 안드로이드 커널의 binder driver에서 use-after-free 취약점으로 로컬 권한을 가진 공격자 또는 앱이 root 권한을 획득할 수 있고 잠재적으로 장치를 원격 제어가 가능하다. 취약한 안드로이드 장치 이 취약점은 2017 년 12 월에 릴리스 된 4.14 LTS Linux ..
[LOB] - zombie_assassin -> succubus 풀이
[LOB] - zombie_assassin -> succubus 풀이
2019.10.06/* The Lord of the BOF : The Fellowship of the BOF - succubus - calling functions continuously */ #include #include #include // the inspector int check = 0; void MO(char *cmd) { if(check != 4) exit(0); printf("welcome to the MO!\n"); // olleh! system(cmd); } void YUT(void) { if(check != 3) exit(0); printf("welcome to the YUT!\n"); check = 4; } void GUL(void) { if(check != 2) exit(0); printf("wel..
[LOB] - giant -> assassin 풀이
[LOB] - giant -> assassin 풀이
2019.10.06/* The Lord of the BOF : The Fellowship of the BOF - assassin - no stack, no RTL */ #include #include main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack retbayed you!\n"); exit(0); } if(argv[1][47] == '\x40') { printf("library retbayed you, too!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer)..
[LOB] - darkknight -> bugbear 풀이
[LOB] - darkknight -> bugbear 풀이
2019.10.06/* The Lord of the BOF : The Fellowship of the BOF - bugbear - RTL1 */ #include #include main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack betrayed you!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 이번 문제는 필자가 좋아하는 RTL 공격이다. 스택의 주소를 사용할 수 없으므로 공유 라이브러리 함수를 사용해보자. bugbear 바이너리를 분석..
[BaekJoon] - 1004번 어린왕자
[BaekJoon] - 1004번 어린왕자
2019.10.051004번: 어린 왕자 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주어지며, 세 번째 줄부터 n줄에 걸쳐 행성계의 중점과 반지름 (cx, cy, r)이 주어진다. 입력제한은 다음과 같다. (-1000 ≤ x1, y1, x2, y2, cx, cy ≤ 1000, 1 ≤ r ≤ 1000, 1 ≤ n ≤ 50) 좌표와 반지름 www.acmicpc.net 근무 하면서 푼 문제이다. 고민하다가 후임이 좋은 풀이법을 알려주었다. 출발점과 도착점이 주워지고, 행성의 개수가 7개라 하면 아래 표 처럼 만들 수 있다. 원은 (x-x1)**2 + (y-y1)**2..
[LOB] - troll -> vampire 풀이
[LOB] - troll -> vampire 풀이
2019.10.05/* The Lord of the BOF : The Fellowship of the BOF - vampire - check 0xbfff */ #include #include main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } // here is changed! if(argv[1][46] == '\xff') { printf("but it's not forever\n"); exit(0); } strcpy(buffer, argv[1]); printf..
[LOB] - orge -> troll 풀이
[LOB] - orge -> troll 풀이
2019.10.05/* The Lord of the BOF : The Fellowship of the BOF - troll - check argc + argv hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; // here is changed if(argc != 2){ printf("argc must be two!\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("stack is still your..
[LOB] - darkelf -> orge 풀이
[LOB] - darkelf -> orge 풀이
2019.10.05/* The Lord of the BOF : The Fellowship of the BOF - orge - check argv[0] */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // here is changed! if(strlen(argv[0]) != 77){ printf("argv[0] error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1..
[LOB] - wolfman -> darkelf 풀이
[LOB] - wolfman -> darkelf 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - darkelf - egghunter + buffer hunter + check length of argv[1] */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("stack is still yo..
[LOB] - orc -> wolfman 풀이
[LOB] - orc -> wolfman 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - wolfman - egghunter + buffer hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); }..
[LOB] - goblin -> orc 풀이
[LOB] - goblin -> orc 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - orc - egghunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } strcpy(buffer, argv..
[LOB] - cobolt -> goblin 풀이
[LOB] - cobolt -> goblin 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - goblin - small buffer + stdin */ int main() { char buffer[16]; gets(buffer); printf("%s\n", buffer); } 이번 문제는 작은 크기의 buffer 에 gets() 함수로 사용자에게 입력을 받고 있다. 이전 문제 풀이와 똑같이 RTL 공격 기법을 사용할 것이다. RTL에 대한 설명은 아래 링크에 설명되어 있다. https://lactea.kr/entry/bof-Return-to-Libc-RTL-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EB%B2%95?category=866608 [bof] - Return to Libc (RTL)..
[LOB] - gremlin -> cobolt 풀이
[LOB] - gremlin -> cobolt 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - cobolt - small buffer */ int main(int argc, char *argv[]) { char buffer[16]; if(argc cobolt 문제이다. 위 코드를 보면 buffer의 크기가 16bytes로 작아진 것을 볼 수 있다. 즉, buffer에 shellcode를 넣을 수 없다는 뜻이다. 따라서 필자는 RTL 공격 기법을 사용할 것이다. RTL 공격 기법에 대한 설명은 아래 링크..
[LOB] - gate -> gremlin 풀이
[LOB] - gate -> gremlin 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - gremlin - simple BOF */ int main(int argc, char *argv[]) { char buffer[256]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } LOB 첫번째 문제이다. buffer 변수의 크기는 256bytes 인데, strcpy에서 argv[1]의 값을 buffer로 값을 복사하는 과정에서 bof 공격이 가능하다. gdb로 분석하기 위해 gate 바이너리 파일을 복사한 후 분석을 진행하겠다. [gate@localhost gate]$ mkd..
[webhacking.kr 2019 old] - challenge 18
[webhacking.kr 2019 old] - challenge 18
2019.10.01sql injection 문제이다. 소스 보기를 하면 몇몇개의 문자들이 필터링 되어 있다.
[webhacking.kr 2019 old] - challenge 17
[webhacking.kr 2019 old] - challenge 17
2019.10.01이번 문제는 입력하는 곳이 주어지고 마찬가지로 javascript로 값을 비교하여 어떤 곳으로 요청을 보내는 문제이다. 아래 코드는 문제 내에 있는 javascript 문제이다. unlock=100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+1/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+100*10*10+1..
[webhacking.kr 2019 old] - challenge 16
[webhacking.kr 2019 old] - challenge 16
2019.10.01이번 문제의 html 코드를 보면 아래와 같이 javascript 코드가 있는 것을 볼 수 있다. document.body.innerHTML+="*"; function mv(cd){ kk(star.style.left-50,star.style.top-50); if(cd==100) star.style.left=parseInt(star.style.left+0,10)+50+"px"; if(cd==97) star.style.left=parseInt(star.style.left+0,10)-50+"px"; if(cd==119) star.style.top=parseInt(star.style.top+0,10)-50+"px"; if(cd==115) star.style.top=parseInt(star.style.top+0,..
[webhacking.kr 2019 old] - challenge 14
[webhacking.kr 2019 old] - challenge 14
2019.10.01이번 문제는 뭔가를 입력하는 곳이 있다. html 코드를 보면 javascript 코드로 어떠한 행위를 하는데, 아래 코드를 보자. function ck(){ var ul=document.URL; ul=ul.indexOf(".kr"); ul=ul*30; if(ul==pw.input_pwd.value) { location.href="?"+ul*pw.input_pwd.value; } else { alert("Wrong"); } } ul 값과 사용자가 입력한 값이랑 비교해서 같으면, GET 방식으로 요청을 보낸다. 간단하게 크롬 콘솔창에서 ul 값을 확인해 보겠다. var ul=document.URL; ul=ul.indexOf(".kr"); ul=ul*30; console.log(ul); 위 코드를 실행해보면..
[webhacking.kr 2019 old] - challenge 10
[webhacking.kr 2019 old] - challenge 10
2019.10.01위 문제의 소스 코드중 중요한 부분만 가져오면 아래와 같다. a 태그를 클릭하면 onclick 액션이 실행되는데, 왼쪽으로 1px 만큼 움직인다. 이 값이 1600px 이면 GET 방식으로 요청을 보낸다. O 이 문제를 풀기 위해서는 풀이 법이 다양하겠지만, 필자는 그냥 style 값에서 left 값을 1599px 값으로 수정한 후 a 태그를 클릭했다. 그럼 left 값은 1600px가 되고 조건에 맞게 되므로 문제가 풀리게 된다.