이번에는 data.txt 파일에 있는 몇몇 human-readable 문자열 중 하나이며, 몇개의 '='문자와 같이 등장한다고 한다.
$ strings 명령어 : 파일 내의 ASCII text로 이루어진 문자열을 추출(?)
이렇게 해보았다.
비밀번호 찾았당 ^^ ㅎ
이번에는 data.txt 파일에 있는 몇몇 human-readable 문자열 중 하나이며, 몇개의 '='문자와 같이 등장한다고 한다.
$ strings 명령어 : 파일 내의 ASCII text로 이루어진 문자열을 추출(?)
이렇게 해보았다.
비밀번호 찾았당 ^^ ㅎ
이번에는 data.txt 안에 존재하는 문자열 중 오직 한 번만 등장하는 문자열이 정답이라고 하는 것 같다.
sort 명령어와 uniq 명령어를 사용해보았다.
sort 명령어는 문자열을 오름차순으로 정렬해주는 명령어
sort [파일명]
uniq 명령어는 정렬된 문자열에서 중복되는 문자열들을 없애주는 역할을 한다.)
uniq -u 옵션 : 중복되지 않은 녀석들 제거
정답 !! ^^
bandit Overthewire | level 7 -> level 8 (0) | 2023.07.17 |
---|---|
bandit Overthewire | level 6 -> level 7 (0) | 2023.07.13 |
bandit Overthewire | level 5 -> level 6 (0) | 2023.07.12 |
bandit Overthewire | level 4 -> level 5 (0) | 2023.07.12 |
bandit Overthewire | level 3 -> level 4 (0) | 2023.07.12 |
이번에는 data.txt 라는 파일 속에 millionth옆에 비밀번호가 있다고 한다.
이럴 때 당장 생각나는건 우선 grep 명령어를 통해서 millionth 가 포함된 문장을 찾는 것을 생각해보았다.
어라... 간단하게 해결되었다.
% grep 사용법
추출된 문자열에서 특수한 문자 또는 문자열이 포함된 행을 찾는 명령어이다.
grep "문자열"을 통해 찾아낼 수 있다.
끗
bandit Overthewire | level 8 -> level 9 (0) | 2023.07.17 |
---|---|
bandit Overthewire | level 6 -> level 7 (0) | 2023.07.13 |
bandit Overthewire | level 5 -> level 6 (0) | 2023.07.12 |
bandit Overthewire | level 4 -> level 5 (0) | 2023.07.12 |
bandit Overthewire | level 3 -> level 4 (0) | 2023.07.12 |
이번에는 무슨 서버 어딘가에 있다고 하고
bandit7이라는 유저의 소유, bandit6 그룹에 속해있고, 33 byte라고 한다.
이번에도 find 명령어를 사용해볼 수 있을 것 같다. 그런데...
애초에 홈디렉토리에 아무것도 존재하지 않는다..
그런데 문제의 발문을 다시한번 살펴보면 홈디렉토리가 아닌 "서버 어딘가" 에 있다고 했으니깐
루트 디렉토리에서 살펴보면 되지 않을까 싶다.
find 명령어를 이용해서 user, group, size 옵션을 이용해서 찾아봤는데도 뭐가 엄청 많이 나온다.
이렇게 해서는 뭘 찾기가 힘들어보인다.
우선 해결방법이다.
이렇게 하면 permission denied가 뜬 행들을 다 지워버리고 우리가 찾는 결과만 남길 수 있는데,
2>/dev/null
1. 파일 디스크립터
자세한 내용은 생략하고 여기에 필요한 정보만 가져오자면,
파일 디스크립터는 파일의 실행 등등을 관리하는 일종의 flag라고 볼 수 있을 것 같다.
0,1,2는 각각이 고유의 의미를 가지고 있고, 3부터는 파일이나 프로그램실행시마다 임의로 부여되는데,
0 : 표준 입력
1 : 표준 출력
2 : 표준 에러
라는 의미를 가지고 있다.
우리가 본 결과에서 Permission denied는 에러가 표시되었다는 뜻이므로 2 가 될 것이다.
이제 이녀석들이 출력되지 않도록 관리해야겠지?
2. redirection
A > B : A의 결과를 B로 보냄
A >> B : A 결과를 B 데이터에 추가
A < B : B의 데이터를 A에 입력
라는 뜻을 가지고 있다.
3. /dev/null
리눅스에서 쓰이는 일종의 쓰레기통같은거다.
이런 개념을 이용해서 에러가 난 (권한 문제 등) 파일들을 버려버리면,
정답을 찾을 수 있다.
끗
bandit Overthewire | level 8 -> level 9 (0) | 2023.07.17 |
---|---|
bandit Overthewire | level 7 -> level 8 (0) | 2023.07.17 |
bandit Overthewire | level 5 -> level 6 (0) | 2023.07.12 |
bandit Overthewire | level 4 -> level 5 (0) | 2023.07.12 |
bandit Overthewire | level 3 -> level 4 (0) | 2023.07.12 |
inhere directory에 있고, ascii text에 1033byte, 실행가능하지 않은 파일이라고 한다.
뭔가 조건이 까다로워보인다.
이럴 때 사용하는 find 명령어.
find 명령어에서 -size 옵션을 이용하면 파일의 크기를 알 수 있다.
1033 뒤에 붙은 c는 byte단위로 찾으라는 뜻.
b : 블록단위
c : byte
k : kbyte
w : 2byte 워드
라는 단위이다.
이렇게 하면 파일이 한개 나오는데,
이게 정답이다.
끗
bandit Overthewire | level 7 -> level 8 (0) | 2023.07.17 |
---|---|
bandit Overthewire | level 6 -> level 7 (0) | 2023.07.13 |
bandit Overthewire | level 4 -> level 5 (0) | 2023.07.12 |
bandit Overthewire | level 3 -> level 4 (0) | 2023.07.12 |
bandit Overthewire | level 2 -> level 3 (0) | 2023.07.12 |
이번에는 inhere 디렉토리에 있는 human-readable 파일 안에 비밀번호가 있다고 한다. 이게 무슨말일까 일단 가보자.
흠 파일이 엄청 여러개가 있다.
file 명령어를 이용하면 파일의 속성을 이용할 수 있다.
"*" 기호는 모든 파일을 지칭한다.
여기에서 ./-*라고 한 것은 "-"로 시작하는 모든 파일의 속성을 보여달라는 말로 이해할 수 있을 것이다,
명령어 실행 결과를 보면 -file07이 ASCII text인 것을 알 수 있다.
문제에서 human-readable file이라고 했고, ascii text는 우리가 읽을 수 있으므로 저 파일이 정답일것이다.
찾았당 ㅎ
bandit Overthewire | level 6 -> level 7 (0) | 2023.07.13 |
---|---|
bandit Overthewire | level 5 -> level 6 (0) | 2023.07.12 |
bandit Overthewire | level 3 -> level 4 (0) | 2023.07.12 |
bandit Overthewire | level 2 -> level 3 (0) | 2023.07.12 |
bandit Overthewire | level 1 -> level 2 (0) | 2023.07.11 |
inhere라는 디렉토리 안에 password가 숨겨져 있다고 한다.
cd 명령어를 이용해서 간단하게 해결할 수 있다.
cd : change directory
cd [디렉토리명] 을 하면, 디렉토리를 이동할 수 있다.
inhere 디렉토리로 이동해서 ls를 이용해 뭐가 있나 봤는데, 아무것도 없다.
그런데 문제에서 hidden file이라고 했으니, 숨겨진 파일을 찾아야 한다.
ls 명령어의 a 옵션을 이용하면 숨겨진 파일이나 디렉토리까지 모두 볼 수 있다.
.hiddden이라는 이름의 파일이 보인다.
열어보면 답이 나온다.
bandit Overthewire | level 5 -> level 6 (0) | 2023.07.12 |
---|---|
bandit Overthewire | level 4 -> level 5 (0) | 2023.07.12 |
bandit Overthewire | level 2 -> level 3 (0) | 2023.07.12 |
bandit Overthewire | level 1 -> level 2 (0) | 2023.07.11 |
bandit Overthewire | level 0 -> level 1 (0) | 2023.07.11 |
다음 레벨을 위한 패스워드는 spaces in this filename이라는 파일 안에 담겨져 있다고 한다.
어? 굉장히 이지 하구만.. 하면서 cat으로 실행해보면
각각의 단어로 이루어진 파일들이 존재하지 않는다고 한다.
cat 명령어는 공백을 기준으로 서로 다른 파일이라고 인식하기 때문에 이런 경우 각각, spaces, in, this, filename 이라는 각기 다른 이름의 파일로 인식하여 실행을 시도한다.
따라서 이를 해결하려면 공백을 무시할 수 있도록 해야한다,
두 가지 해결 방법이 존재하는데,(더 있을 수도 있음...)
1. 따옴표로 묶기
2. '\' 기호 사용하기
이렇게 하면 공백을 같이 볼 수 있다.
성공``~
bandit Overthewire | level 4 -> level 5 (0) | 2023.07.12 |
---|---|
bandit Overthewire | level 3 -> level 4 (0) | 2023.07.12 |
bandit Overthewire | level 1 -> level 2 (0) | 2023.07.11 |
bandit Overthewire | level 0 -> level 1 (0) | 2023.07.11 |
bandit Overthewire | level 0 (0) | 2023.07.11 |
지난번 게시물에 이어서 확장 유클리드 알고리즘을 시작해보도록 해보아요...
지난 게시물에서, 유클리드 알고리즘에 의해
GCD(a, b) = GCD(b, r) 이 성립한다는 것을 알았음.
(※ GCD : greatest common divisor : 최대공약수, a % b = r)
확장 유클리드 알고리즘은 최대공약수 gcd를 구하는 것 뿐만아니라, 정수해를 가지는 부정방정식
ax + by = c가 주어질 때, a, b의 최대공약수를 구함과 동시에 이 방정식을 만족하는 x, y를 찾아주는 알고리즘이다.
당연히 식이 하나에 두 변수가 있으므로 unique한 해를 찾는다기보다는 무수히 많은 (x, y) 쌍에 대한 규칙을 찾는 것이라고 보면 될 것이다.
pseudo code 로 작성된 확장 유클리드 알고리즘.
r과 old_r을 각각 b와 a라고 두고(기존 항등식에서 사용하던 a,b와 같음), 나머지 변수들을 치워보면은 기존의 유클리드 알고리즘에서 사용하던 코드와 일치한다는 것을 알 수 있다.
이제, 여기에 s와 t가 추가되었는데, 이들은 초기값은 반드시 0, 1 / 1, 0으로 고정되고, 그 이후는 r. 즉, a, b와 비슷한 방식으로 처리되게 됨.
161x + 28y = 7을 계산해보자.
X_new는 이번 사이클에서 새롭게 구해지는 값을 말한다.
q는 이번 사이클에 구해지는 몫이다.
초기 세팅은 이러하다.
- q = old_r / r
- r_new = old_r - r * q
- s_new = old_s - s * q
- t_new = old_t - t * q
q | old_r | r | r_new | old_s | s | s_new | old_t | t | t_new |
161 | 28 | 1 | 0 | 0 | 1 |
old_r = a, r = b로 세팅하고(그저 초기값일 뿐이랍니다), old_s, sm old_t, t는 1, 0, 0, 1로 각각 고정시켜놓는다.
q | old_r | r | r_new | old_s | s | s_new | old_t | t | t_new |
5 | 161 | 28 | 21 | 1 | 0 | 1 | 0 | 1 | -5 |
28 | 21 | 0 | 1 | 1 | -5 |
첫 스텝에서 old_r(a)을 r(b)로 나눈 몫 q = 5, r = 21이다.
이 예시에서는 a, b가 양수라서 별 상관이 없긴 하지만, 원래 확장유클리드 알고리즘은 음수에서도 작동을 해야한다. 그래서 r_new는 반드시 0 이상 abs(r) 미만의 정수가 되어야 한다(다들 아실거라고 믿고..)
예를 들어 7/(-3)을 한다고 하면 그 몫은 -2가 아니라 -3이라는 말이다. 7 - (-3 * -3)를 해야 나머지가 2. 즉, 0 이상 3 미만의 값으로 들어오기 떄문이다.
자 여기까지 왔으면, 나머지 s와 t를 구해준후
한칸씩 왼쪽으로 밀어서 두 번째 사이클을 준비해준다.
q | old_r | r | r_new | old_s | s | s_new | old_t | t | t_new |
5 | 161 | 28 | 21 | 1 | 0 | 1 | 0 | 1 | -5 |
1 | 28 | 21 | 7 | 0 | 1 | -1 | 1 | -5 | 6 |
21 | 7 | 1 | -1 | -5 | 6 |
이런 작업을 r = 0이 될 떄까지 반복해주면 우리가 찾던 값이 등장하게 되는 것이다.
q | old_r | r | r_new | old_s | s | s_new | old_t | t | t_new |
5 | 161 | 28 | 21 | 1 | 0 | 1 | 0 | 1 | -5 |
1 | 28 | 21 | 7 | 0 | 1 | -1 | 1 | -5 | 6 |
3 | 21 | 7 | 0 | 1 | -1 | 4 | -5 | 6 | -23 |
7(GCD) | 0 | -1 | 4 | 6 | -23 |
이러한 과정을 거친 결과 r = 0인 사이클에서, old_r = GCD인 것을 알 수 있고,
ax + by = c의 값을 구할 수 있는 것이다.
이 때,
x = old_s = -1
y = old_t = 6
c = GCD(161, 28) = 7임을 알 수 있다.
결과 : 161 * (-1) + 28 * 6 = 7
이렇게 확장 유클리드 알고리즘을 간단하게 알아보았다 ^^
s_new 와 t_new를 구하는 과정이 r_new를 구하는 과정과 같은 이유는
같은 연산을 적용해나가면서 값을 찾아주기 위함이다.
이걸 적용해볼만한 문제를 보게 된다면 아래 덧붙이도록 해보도록 노력해보도록... 해보겟슴미다.
[CryptoHack] Diffie-Hellman: Export-grade 풀이, SageMath 사용해보기 (1) | 2024.07.02 |
---|---|
[CryptoHack] Diffie-Hellman: Parameter Injection 풀이 (2) | 2024.07.01 |
[Crypto] Crypto 관련 python 함수 사용법 (0) | 2024.04.12 |
인코딩 & 디코딩 | Base64에 대하여... (0) | 2023.07.17 |
암호 관련 수학 공부 | 확장유클리드 알고리즘 | Extended Euclidean Algorithm (0) | 2023.07.11 |