본문 바로가기

전체 글

(59)
[InsecureBankv2] 루팅 탐지 및 우회 취약점 개요 취약점 설명 안드로이드 애플리케이션은 보안상의 이유로 루트 권한을 막아 놓았다. 루팅 탐지 및 우회는 루트 탐지를 우회하는 취약점을 의미한다. 보안 위협 관리자 권한을 획득할 수 있으며, 민감한 정보에 접근할 수 있다. 발생 위치 /system/bin/su, /system/xbin/su, /system/app/superuser.apk, /data/data/com.noshufou/android.su 취약점 진단 과정 Step 1) 루팅 확인 루팅 확인이 필수적인 금융 및 게임 애플리케이션에서는 다음의 4가지 항목을 필수적으로 점검한다. /system/bin/su /system/xbin/su /system/app/superuser.apk /data/data/com.noshufou/android...
[백준/Python] 1021 회전하는 큐 문제 링크 1021번: 회전하는 큐 첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가 www.acmicpc.net 문제 풀이 큐의 맨 앞의 숫자가 현재 뽑고자 하는 숫자가 일치할 때까지 큐를 왼쪽, 오른쪽으로 돌려야(rotate) 한다. 만약 큐의 맨 앞의 숫자가 일치한다면 큐를 제거하고(popleft), 그렇지 않다면 어느 방향으로 돌릴 것인지를 정해야 한다. 이때, 뽑고자 하는 숫자의 위치가 중간 위치랑 같거나 작다면 왼쪽으로 로테이션하고, 그보다 크다면 오른쪽으로 로테이션을 해야 값이 최소가 된다. 전체 코드 import sys from collectio..
[Dreamhack] Mango 소스 코드 분석 /login uid, upw 값을 전달 받고, filter 함수를 통해서 필터링을 수행한다. 이후 결과에 따라서 err, uid, undefined를 각각 반환한다. app.get('/login', function(req, res) { if(filter(req.query)){ res.send('filter'); return; } const {uid, upw} = req.query; db.collection('user').findOne({ 'uid': uid, 'upw': upw, }, function(err, result){ if (err){ res.send('err'); }else if(result){ res.send(result['uid']); }else{ res.send('undef..
[Dreamhack] simple-sqli 소스 코드 분석 db table 정보와 계정 정보를 알 수 있다. admin 계정의 비밀번호는 난수를 생성하고, 16바이트 길이의 바이너리 데이터로 만든 다음, 이를 16진수 문자열로 변환하고 디코딩한 값이다. DATABASE = "database.db" if os.path.exists(DATABASE) == False: db = sqlite3.connect(DATABASE) db.execute('create table users(userid char(100), userpassword char(100));') db.execute(f'insert into users(userid, userpassword) values ("guest", "guest"), ("admin", "{binascii.hexlify(o..
[백준/Python] 16564 히오스 프로게이머 문제 링크 16564번: 히오스 프로게이머 첫째 줄에는 캐릭터의 개수 N, 올릴 수 있는 레벨 총합 K가 주어진다. (1 ≤ N ≤1,000,000, 1 ≤ K ≤ 1,000,000,000) 다음 N개의 줄에는 현재 각 캐릭터의 레벨이 X1, X2, X3, ... , Xn 으로 주어진다. (1 ≤ Xi ≤ www.acmicpc.net 문제 풀이 일반적인 이분 탐색 문제이다. 여기서 주의해야 할 점은 end 값 설정이다. 만약 캐릭터 레벨의 총합(sum(arr))보다 k가 무수히 크다면 end 값은 단순히 총합이 아닌 총합과 k를 더한 값이 되어야 한다. 전체 코드 import sys n, k = map(int, sys.stdin.readline().split()) arr = [int(sys.stdin.r..
[백준/Python] 2589 보물섬 문제 링크 2589번: 보물섬 첫째 줄에는 보물 지도의 세로의 크기와 가로의 크기가 빈칸을 사이에 두고 주어진다. 이어 L과 W로 표시된 보물 지도가 아래의 예와 같이 주어지며, 각 문자 사이에는 빈 칸이 없다. 보물 지도의 www.acmicpc.net 문제 풀이 이 문제는 각 육지에서 다른 육지로의 거리 중 최대 거리를 구하는 문제이다. 먼저, 육지(L)인 경우, 너비 우선 탐색을 진행할 수 있도록 한다(for문). 너비 우선 탐색을 진행한 후에는 결과값(res)을 기존의 값과 비교하여 더 큰 값을 저장하도록 한다. 너비 우선 탐색을 진행할 때에는 현재 육지에서 다른 육지와의 거리를 구할 수 있도록 카운트값(c)를 같이 큐에 넣어 진행한다. 큐가 빌 때까지 진행하는데, 마지막에 들어간 값이 가장 거리가..
[InsecureBankv2] 액티비티 컴포넌트 취약점 취약점 개요 취약점 설명 보안적으로 취약한 액티비티가 원래의 로직을 무시하고 강제로 다른 로직을 호출하는 취약점을 의미한다. 보안 위협 권한이 없는 사용자가 특정 액티비티에 접근하여 권한 없이 특정 기능을 활성화할 수 있다. 발생 위치 AndroidManifest.xml 취약점 진단 과정 adb Step 1) 액티비티 android:exported 속성이 true인 항목 확인 Step 2) 액티비티 실행 # am start -n [애플리케이션 설치 주소]/[패키지 주소] am start -n com.android.insecurebankv2/com.android.insecurebankv2.ChangePassword Step 3) 특정 사용자의 비밀번호 변경 로그에서 성공적으로 패스워드가 변경된 것을 확인할..
[백준/Python] 13164 행복 유치원 문제 링크 13164번: 행복 유치원 입력의 첫 줄에는 유치원에 있는 원생의 수를 나타내는 자연수 N(1 ≤ N ≤ 300,000)과 나누려고 하는 조의 개수를 나타내는 자연수 K(1 ≤ K ≤ N)가 공백으로 구분되어 주어진다. 다음 줄에는 원생들 www.acmicpc.net 문제 풀이 각 조에서 가장 키가 작은 원생과 가장 키가 큰 원생의 차이만큼의 비용이 들게 되므로 이 차이를 최소화 해야 한다. 원생은 키 순으로 줄을 서 있으므로, 먼저 인접한 원생의 키 차이(arr[i+1]-arr[i])를 구한다. 이때 가장 차이가 많이 나는 원생은 같은 조가 되면 안되므로 다른 조로 분리를 해야 한다. 위의 과정을 k개의 조가 생성될 때까지 반복하고 각 조의 비용을 더한 값(sum(l[:n-k]))이 최솟값이..
[Dreamhack] SQL Injection Background: Relational DBMS 1. DataBase Management System 1.1. 데이터베이스 관리 시스템 웹 서비스는 데이터베이스에 정보를 저장하고 관리하기 위해 DBMS(DataBase Management System)을 사용 데이터베이스에 새로운 정보를 기록하거나, 기록된 내용을 수정, 삭제하는 역할을 함 다수의 사람이 동시에 데이터베이스에 접근할 수 있음 웹 서비스의 검색 기능과 같이 복잡한 요구사항을 만족하는 데이터를 조회할 수 있음 DBMS 종류 종류 대표적인 DBMS Relational (관계형) MySQL, MariaDB, PostgreSQL, SQLite Non-Relational (비관계형) MongoDB, CouchDB, Redis 관계형은 행과 열의 집..
[백준/Python] 12865 평범한 배낭 문제 링크 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net 문제 풀이 해당 문제는 다이나믹 프로그래밍 중에서도 배낭 문제에 속한다. 이는 n번째의 물건을 각각 담을지 담지 않을지에 따라 최댓값이 결정된다. 먼저, 1~k까지의 무게를 담을 수 있는 가방이 있다고 가정한다. 첫 번째 물건만 고려하면, 무게가 6이므로, 6이전의 무게일 때는 물건을 담을 수 없으므로 각 가방의 최대 가치는 0이 된다. 6부터는 담을 수 있으므로 최대 가치는 13이 된다..
[InsecureBankv2] 로컬 암호화 이슈 취약점 개요 취약점 설명 중요 정보가 단말기에 저장될 때 암호화되어 있지 않거나 취약한 암호화 체계 사용, 또는 복호화 힌트가 소스코드 내 노출되어 있는 취약점을 말한다. 발생 위치 /data/data/com.android.insecurebankv2/shared_prefs/ 보안 위협 암호화하지 않으면 공격자에게 노출될 가능성이 높아진다. 취약점 진단 과정 Step 1) 인시큐어뱅크 애플리케이션의 데이터가 저장되는 곳으로 이동 com.android.insecurebankv2_preferences.xml, mySharedPreferences.xml 파일이 존재하는 것을 확인할 수 있다. cd /data/data/com.android.insecurebankv2/shared_prefs Step 2) 파일 내용..
[백준/Python] 2564 경비원 문제 링크 2564번: 경비원 첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다. 둘째 줄에 상점의 개수가 주어진다. 블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다. 이어 한 줄 www.acmicpc.net 문제 풀이 동근이와 상점의 위치에 따라 각 경우를 나누어야 한다. 먼저, 동근이와 상점이 북쪽, 남쪽으로 서로 마주보고 있을 때를 보면, 항상 세로 길이(y) 만큼은 움직이게 된다. 이때, 왼쪽으로 가는 경로(l+dl)와 오른쪽으로 가는 경로(x*2-l-dl)를 비교하여 더 작은 수만큼 이동하는 것이 최솟값이 된다.동근이와 상점이 서쪽, 동쪽으로 서로 마주보고 있을 때를 보면, 항상 가로 길이(x) 만큼은 움직이게 된다. 이때, 위로 가는 경로(l+dl)와..