블로그에 글을 잘 안쓰긴 했지만 그동안 개인적으로 하고 싶은 연구와 공부를 할 수 있는 기회가 생겨 짧은 논문을 작성하게 되었다.

 

처음 작성하는 논문인데 제대로 하고 싶어서 교수님과 주변 지인분들께 부탁하여 많은 수정을 거쳐 어찌어찌 제출하였다. 

그 이후 교수님께서 학회 한번 갔다오면 된다하셔서 이번 일정에 참여하게 되었다.

 

학회 참석이 6월27일 11시안에는 목적지까지 도착을 해야했었다.

 

잠 자고 새벽에 출발하는게 방법일 수 있지만 그 때 일어날 자신이 없어, PC방에서 친구랑 게임 하다가 첫차를 타자는 생각을 하게 되었다.!

 

(중략)

 

첫차타고 어찌어찌 부산역에 도착하였으나 이 때부터 피로와의 싸움이 시작이 되었다..

 

 

(학회 가는 중)

이 때 부산-오송-광주송정의 일정이여서 절대 잠을 자지 말아야 했다.

 

일단 도착은 했다. 정신이 멍하지만 버틸 수 있었다.

 

 

진짜 도착

 

도착해서 이제 포스터를 붙이는 작업이 있어 같이 논문 작성했던 멤버의 논문 포스터도 붙였다.

 

(이 후 점심 먹고 끝나는 일정인줄 알았다.. 하지만)

 

학술대회 시상식에 참여하게 되었다. 

 

 

상을 받은 후 유스퀘어 터미널에서 버스를 탄 후 사상터미널로 온 다음 12시30분에 기숙사에서 쓰러졌답니다. ㅎ..

 

아무튼 끝

작년에 (전)동아리 회장님이 리버싱 연습하라고 주셨던 엑세스 파일을 주셨던 것이 이 글의 시작이며, 자료가 별로 없어서 리버싱을 하는 과정에서 조금이라도 편안하게 공부할 수 있는 자료가 될 거 같다.

 

 

IDA에 해당 엑세스(.exe) 확장자 파일을 열어주고 IDA-VIEW가 아닌 HEX-VIEW로 16진수에서 값을 찾는게 조금 더 수월하며 Function name에서 main/ sub_number과 같은 함수를 먼저 들어가서 확인하는 것이 워게임이나 리버싱 연습할 때 괜찮은 방법중 하나라 생각이라 느낀다. 

0000000140002260  FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF  ................
0000000140002270  74 68 69 6E 6B 32 30 32  32 00 00 00 00 00 00 00  think2022.......
0000000140002280  6B 65 79 B0 AA C0 BB 20  C0 D4 B7 C2 C7 CF BC BC  key.... .....ϼ .
0000000140002290  BF E4 3A 00 25 73 00 00  C0 CE C1 F5 20 BC BA B0  ....%s...... ...
00000001400022A0  F8 20 0A 00 00 00 00 00  54 48 49 4E 4B 5F 43 54  . ......THINK_CT
00000001400022B0  46 7B 71 69 77 32 38 31  6E 77 64 69 73 30 61 30  F{qiw281nwdis0a0
00000001400022C0  77 32 6A 77 64 5F 67 6F  6F 64 6A 6F 62 7D 0A 00  w2jwd_goodjob}..
00000001400022D0  C5 B0 20 B0 AA C0 CC 20  C0 CF C4 A1 C7 CF C1 F6  Ű  .... ..ġ ....
00000001400022E0  20 BE CA BD C0 B4 CF B4  D9 2E 20 0A 00 00 00 00   .ʽ ..ϴ .. ...

 

아무튼 위 코드를 보면 함수와 16진수, 16진수가 문자로 변환된 값이 있고 누가봐도 "저게 정답인 가?"  싶은게 정답이 맞다. 

 

: THINK_CTF{qiw281nwdis0a0 w2jwd_goodjob}

 


 

그리고 시간 날 때 마다 블로그 글을 작성해서 올려보겠습니다. 

드림핵 난이도 1단계 문제인 What-is-my-ip 를 풀어보려 한다.

 

사실 예전에 잠깐 풀어봤다가 정말 오랜만에 문제를 시도한건 안비밀

아무튼 VM서버를 접속하면 아래와 같이 자신의 IP주소가 뜨는데 

 

문제에 압축파일을 풀어보면 

 

 

위와 같이 나오고  requirements.txt에서 flask가 뜬다. 뜬금없이 말을 한 거 같지만 의외로 중요한 부분이였다.

문제를 풀기 위해 버프스위트를 사용하였고 

 

 

요청값에서 기본으로 세팅을 복사하여 붙여넣으면 위와 같이 나온다.

위 문제가 http의 헤더를 이용하는 것이였고 대중적으로 널리 알려진 취약점이 있나 찾던 중 

X-Forwarded-For: <client>, <proxy1>, <proxy2>

 

위와 같은 문법으로 쓰인다.

 

 

X-Forwarded-For: ;cat /flag

라 작성하면 

정답이 나온다.

이차잉여란 해(근)를 가질 때, 정수 a을 법 m이며, 해(근)를 가지지 않을 때 정수 a을 법 m으로 한 이차비잉여 라고 한다.

 

이차잉여에서 집합 Z_m* 의 원소를 제곱해서 갑을 구할 수 있다.

 

이를 계산하기 위해선 오일러의 판정기준이 있다 

홀수인 소수 p와 (a, p) = 1인 정수 a에 대하여 성립한다.

 

Ⅰ) 정수 a가 이차잉여일 때 필요충분조건은 a^ p-1/2 ≡ 1(mod p)이다.

이때, 합동식 x^2 ≡ a (mod p)에서 꼭 두 개의 해를 가진다.

 

Ⅱ) 정수 a가 이차비잉여일 때 필요충분조건은 a^ p-1/2 ≡ -1(mod p)이다.

이차비잉여에서 필요충분조건이란 홀수인 소수를 뜻한다.

 

이때, 합동식 x^2 ≡ a (mod p)에서 해가 존재하지 않는다.

 

※이차잉여를 계산할 때 기약잉여계를 바탕으로 계산해야한다.

'Math > Crypto math' 카테고리의 다른 글

[정수론], 원시근  (0) 2023.11.24
[정수론], Fermat와 Euler 정리  (1) 2023.11.15
[정수론], 일차합동식  (0) 2023.11.10
[정수론], Wilson의 정리  (0) 2023.11.08
[정수론], 역원  (3) 2023.11.06

원시근을 하기에 앞서 먼저 배워야 할 것은 위수(order)이다.

(a, m) = 1이 성립되고  a^r ≡ 1 (mod m)을 만족하는 정수 중에서 가장 작은 양의 정수 r(나머지)을 법 m, p에 관한 a의 위수이다.

 

예시로 들자면 법 7에 관한 2의 위수를 구하여라

 

2^r ≡ 1(mod 7)을 만족하는 가장 작은 양의 정수 r을 구할 때 2^1 ≡ 1(mod 7), 2^2 ≡ 4 (mod 7),  2^3 ≡  1(mod 7)

법 7에 관한 2의 위수는 3 ≤ ∂(7) = 6이다. 즉 ord_7 2 = 3이다. 

 

법 7에 관한 3의 위수에서 3^r ≡ 1(mod 7)일 때 3^1 ≡  3 (mod 7), 3^2 ≡  2 (mod 7), 3^3 ≡  6 (mod 7), 3^4 ≡  4 (mod 7), 3^5 ≡  5 (mod 7), 3^6 ≡  1 (mod 7)이며 법 7에 관한 3의 위수는 r = 6이다.  

위수:ord_7 3 = 6인 것이다.

 

※계산할 때 오일러 피 함수로 모듈러 m, p를 먼저 구하고 나온 값 만큼 거듭제곱을 해야한다. (1 ~ m-1 까지)

 

n | ∂(m) 은 약수배수 관계이다. 또한 ∂(m)은 원소의 개수와 같다.

 

원시근과 위수는 꽤나 비슷하다. ord_m a =  ∂(m) 동일한 값이 나오면 원시근, ord_m a 일 때 위수인 것이다.

원시근은 2, 4, p^k, 2p^k만 존재하고 그 이상에 합성수는 존재하지 않는다. 

값이 있더라도 그 값은 해가 될 수 없다.

 

존재하는 경우는 집합 Z^* p인 기약잉여계 즉 소수일 때만 존재한다.

 

'Math > Crypto math' 카테고리의 다른 글

[정수론], 이차잉여  (1) 2023.12.11
[정수론], Fermat와 Euler 정리  (1) 2023.11.15
[정수론], 일차합동식  (0) 2023.11.10
[정수론], Wilson의 정리  (0) 2023.11.08
[정수론], 역원  (3) 2023.11.06

오일러 함수에 설멍하자면 완전잉여계, 기약잉여계를 사용할 때 Zm, Zp에 대한 값으로 해당 식에 답이 몇 개 존재하는지 판별할 수 있는 함수이다.

 

∂(m)  = |Z* m|이랑 동일하다.

 

m이 거듭제곱, 소수, 합성수일 때 오일러 함수를 계산할 때 식이 달라진다.

 

한 자리 소수일 경우: ∂(m)  = m-1 

합성수 일 경우: ∂(m) = (m-1) x (n-1)  

거듭제곱 일 경우= m^2 - m^1 

 

 

와 같이 계산하면 된다.

 

예시를 보여주면  ∂(3)  = 3-1  = 2,  ∂(6) = (3-1) x (2-1) = 2 x 1 = 2 , ∂(9) = (3^2) - (3^1) = 9 - 3 = 6 과 같다.

 값이 클 경우는 어떻게 계산하나요?

 

소인수분해 했을 때 나왔던 값만 넣어주면 되며 이 식에는 지수가 들어가지 않는다.

 

 

페르마 정리는 a^ ∂(p) ≡ 1 (mod p) 또는 a^p-1 ≡ 1 (mod p)라는 점이다. (첫번째 버전)

어떠한 양의 정수가 소수인가를 판정하는데 필요한 정리이다.

 

두번째 버전에선 a^p ≡ a (mod p)를 만족한다고 해서 p가 반드시 소수는 아니하다.  

 

 

'Math > Crypto math' 카테고리의 다른 글

[정수론], 이차잉여  (1) 2023.12.11
[정수론], 원시근  (0) 2023.11.24
[정수론], 일차합동식  (0) 2023.11.10
[정수론], Wilson의 정리  (0) 2023.11.08
[정수론], 역원  (3) 2023.11.06

일차합동식은 일차방정식과 같은 형태지만 합동식이 들어가 있어 일차합동식이라 부른다.

식으로 표현하자면 ax+ b ≡ 0 (mod ⁡m)에 형태이다.

 

일차방정식이 있듯이 이차방정식이 있고 당연히 이차합동식 또한 존재한다.

 

x^2 + 1 ≡ 0 (mod 5)일 때  , f(x) = x^2 + 1 ≡ 0 (mod 5)

f(0) = 1 ≡ 1 (mod 5) ,  f(1) = 2 ≡ 2 (mod 5), f(2) = 5 ≡ 0 (mod 5)

f(3) = 10 ≡ 0 (mod 5), f(4) = 17 ≡ 2 (mod 5)

 

그로 인해 해가 존재하는건  x ≡ 2 (mod 5), x ≡ 3 (mod 5)가 이차합동식의 해이다.

답을 작성할 때 해가 존재하는 경우 위와 같이 적어주고 해가 존재하지 않을 경우 해가 존재하지 않다. 라 작성하면 된다.

 

위 식에서 계산은 덧셈으로 하였을 때 항등원은 0이며, m = 5 이므로 5 = {0 ,1, 2, 3, 4} f(x)의 x값안에 차례대로 대입하여 계산한다.

 

반대로 

 

만약 식이 곱셉이였을 때 항등원은 1이며, m 또는 p로 0을 제외한 수로 대입하며 계산해야한다.

 

일차 합동식 ax ≡ b (mod m)이 해를 가지기 위해 필요충분조건 d = (a, m)과 d | b일 때 성립된다. 

d = (a, m) = gcd (a, m) 즉 최대공약수 1이 되야하며, d | b의 수가 약수, 배수 관계가 되면 가능하다.

 

위 식의 경우 곱셈으로 되어있는 일차합동식인데 (a x s) + (b x t) = 1이 성립이 되어야 하며, 식을 풀어 나갈 때 "확장된 유클리드 알고리즘"으로 계산 해야한다. 

 

r = r_1 - (q × r_2 ), S = S1 - (q × S2 ), t = t1 (q x t2 )

r = 나머지

'Math > Crypto math' 카테고리의 다른 글

[정수론], 원시근  (0) 2023.11.24
[정수론], Fermat와 Euler 정리  (1) 2023.11.15
[정수론], Wilson의 정리  (0) 2023.11.08
[정수론], 역원  (3) 2023.11.06
[정수론], 잉여계  (1) 2023.11.03

레지스터의 종류는 많지만 그 중 알아볼 레지스터는 "프로세서 레지스터"이다.

 

주로 자료를 보관하는 기억 장소이다. 일반적으로 현재 계산을 수행중인 값을 저장하는 데 사용되며, 대부분의 현대 프로세서는 메인 메모리에서 레지스터로 데이터를 옮겨와 데이터를 처리한 후 그 내용을 다시 레지스터에서 메인 메모리로 저장하는 로드-스토어 설계를 사용하고 있다.

 

프로세서 레지스터에서도 여러개로 나눠진다.

  • 데이터 레지스터 : 정수값을 저장할 수 있는 레지스터.
  • 주소 레지스터 : 메모리 주소를 저장하여 메모리 접근에 사용되는 레지스터. 어떤 프로세서에서는, 주소를 저장하는 것이 아니라 조작하기 위한 목적으로 색인 레지스터를 사용하기도 한다.
  •  범용 레지스터 : 데이터와 주소를 모두 저장할 수 있는 레지스터.
  • 부동소수점 레지스터 : 많은 시스템에서 부동소수점 값을 저장하기 위해 사용된다.
  • 상수 레지스터 : 0이나 1 등 고정된 값을 저장하고 있는 레지스터.
  • 특수 레지스터 : 프로그램의 상태를 저장한다. 프로그램 카운터, 스택포인터, 상태 레지스터 등이 있다
  • 명령 레지스터: 현재 실행중인 명령어를 저장한다.
  • 색인 레지스터 : 실행중에 피연산자의 주소를 계산하는 데 사용된다.

 

 

 

'Computer science > Disassemble' 카테고리의 다른 글

디스어셈블리, 기본 개념  (0) 2023.11.02

+ Recent posts