블로그 이미지
Nehoy
경기대학교 / kknock

calendar

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

Notice

Tag

2020. 9. 7. 18:18 프로그래밍

게임할 때 음악을 끄거나 키러 왔다갔다 하기 귀찮아서 만들게 되었다.

 

YMC는 트레이 프로그램으로 WebSocket 서버를 열고 있다.

Extension은 Youtube Music이 틀어지게 되면, 해당 페이지에서 WebSocket을 열어 YMC 프로그램과 통신한다.

단축키를 입력하면 YMC 프로그램이 클라이언트들에게 메세지를 전송하고, 메세지를 수신한 Extension이 버튼을 누름으로써 기능을 동작한다.

 

Github - YMC: github.com/beuoon/YMC

Github - YMC_Extension: github.com/beuoon/YMC_Extension

 

크롬 스토어: https://chrome.google.com/webstore/detail/youtube-music-controller/mjmmnjpdohmbdbkjbjgiomknfmfccknh

 

Youtube Music Controller

youtube music controller

chrome.google.com

웨일 스토어: https://store.whale.naver.com/detail/lgjjfmjdfimclookhheidkbgbianandm

 

Youtube Music Controller

youtube music controller

store.whale.naver.com

 

'프로그래밍' 카테고리의 다른 글

[개인 공부] 거북이 프로그램  (2) 2017.06.07
[개인 공부] 하노이 타워  (0) 2017.05.20
posted by Nehoy
2020. 2. 22. 18:07 Hack/리버싱

verifier.zip
0.00MB

정해진 문법에 맞추어 코드를 입력하면 실행해주는 프로그램이다.

 

입력한 코드를 a_interp를 통해 시뮬레이션을 돌려보고 에러가 없으면, interp를 통해 실제 구동을 한다.

 

플래그는 위와 같이 Print 구문을 통해 얻을 수 있다. 실제 구동에서 출력할 변수 값이 음수이면 플래그를 출력하는데, 시뮬레이션 도중 출력할 변수 값이 음수이면 print domain error을 발생시킨다.

 

IfElse, While, Cond, Num, Random 구문이 위 Print 구문처럼 시뮬레이션 코드와 실제 구동 코드가 다르다. 예시로 IfElse 구문을 살펴보자.

 

실제 구동 코드에서는 조건 값에 따라 실행하는 코드가 달라지고 그에 따라 변수의 값이 변하는데, 시뮬레이션의 경우 조건문에 사용되는 변수를 참이 되는 범위와 거짓이 되는 범위로 나누고 변수가 변할 수 있는 값의 범위를 확인한다. 간단히 하면, 시뮬레이션의 경우 변수가 변할 수 있는 모든 범위를 확인한다고 할 수 있다.

 

가능한 모든 범위를 확인하는 IfElse와 달리, While 구문의 경우 반복문을 5번만 실행해본다. 여기서 env_join은 코드를 실행한 후 변수의 값을 갱신하는 것이고, env_widen은 코드를 실행한 후 변수의 변경 추이에 따라 값이 증가하면 inf, 값이 감소하면 -inf로 설정하는 것이다.

132줄을 통해 -inf, inf로 변한 값들 중 조건문에서 사용되는 변수의 경우 134줄의 cond.a_interp를 거치면서 -inf, inf값이 조건문의 범위에 맞게 변하지만, 그 이외의 변수들은 계속 -inf 혹은 inf값을 갖고 있는다.

 

그래서 위와 같은 코드에서 a가 음수가 될 수 없음에도 시뮬레이션 코드에서는 -inf가 되기 때문에 domain error가 발생한다.

우회 방법은 env_widen을 할 때 출력할 변수의 값을 감소시키지 않는 것이다.

따라서, 반복이 4번을 넘을 때부터 감소를 하면 되는데, 아래와 같이 안되는 방법도 있으니 주의해야 한다.

 

 위와 같은 방법은 136번줄에서 a의 범위가 -1~0이 되기 때문에 안된다.

 

위 코드의 경우 136번줄에서 a의 범위가 0~1이 되기 때문에 우회가 가능하다.

Flag: CODEGATE2020{4bstr4ct_1nt3rpr3tat10n_f0r_54f3_3v41uat10n}

 

 

 

'Hack > 리버싱' 카테고리의 다른 글

Codegate2020 Preliminary: Halffeed  (0) 2020.02.22
Windows Exception  (0) 2020.01.18
[CSAW 2017] tablez  (0) 2017.09.20
[Codegate 2016] compress  (0) 2017.05.20
[CodeEngn] Challenges : Basic 01  (0) 2016.12.20
posted by Nehoy
2020. 2. 22. 18:03 Hack/리버싱

Halffeed.zip
0.00MB

입력 값을 암호화해주는 프로그램이다.

 

3Execute 메뉴에 복호화 했을 때 cat flag가 나오는 암호문과 태그 값을 입력하면 플래그를 얻을 수 있다.

 

하지만 서버에서는 cat flag가 포함된 평문을 암호화할 수 없다.

 

암호에 사용되는 키 값 또한 서버에 파일로 존재하기 때문에 알 수 없다.

평문을 암호화하는 코드는 위와 같다. 코드를 살펴보면 T와 평문을 xor 연산하여 암호문을 생성하고 있다. 여기서 평문에 00000000000000000000000000000000를 넣으면 T leak할 수 있다는 걸 알 수 있다.

 

00000000000000000000000000000000 ;cat flag;000000

00000000000000000000000000000000 3B63617420666C61673B303030303030

우리는 평문을 위와 같이 넣었을 때 나오는 암호문과 태그 값을 원하기 때문에 다음과 같이 평문을 넣어 블록 연산에 사용되는 T를 구한다. (블록이 두개인 이유는 이후에 서술할 collision 때문이다.)

00000000000000000000000000000000 00000000000000000000000000000000

T2_1 = ec8e2e8ec0319fbaa0e7d4d819006e28

T2_2 = e6048fd38996e7cb945879d068a612bd

T를 알아냄으로써 우리는 우리가 원하는 암호문을 다음과 같이 얻을 수 있다.

CHIPER_TEXT = ec8e2e8ec0319fbaa0e7d4d819006e28 dd67eea7a9f08baaf36349e05896228d

 

이제 태그 값을 알아내야 하는데 위 코드를 참고하면, 우리가 원하는 태그 값이 다음과 같다는 것을 알 수 있다.

하지만 AES_Encrypt에 사용되는 키 값을 모르기 때문에 태그 값을 바로 구하지는 못하고, 우리가 알 수 있는 ANS 값을 이용해 태그 값을 구해야 한다.

 

P2 = 00000000000000000000000000000000 3B63617420666C61673B303030303030

P1 = ?

P1를 입력했을 때의 ANS값과 P2를 입력했을 때의 ANS값을 같게 하고, P1을 서버에서 암호화하면 우리가 원하는 태그 값을 얻을 수 있다는 게 핵심이다.

여기서 블록을 두개 사용하는 이유가 나오는데, 첫번째 블록이 달라지면 두번째 블록에서 사용되는 T_2값이 달라지기 때문에 두개의 블록을 사용하는 것이다.

 

P1_1 = 11111111111111111111111111111111

P1의 첫번째 블록에 사용할 값은 위와 같다. T1_2를 알아내기 위해 다음과 같은 값을 서버에서 암호화한다.

11111111111111111111111111111111 00000000000000000000000000000000

T1_2 = 00928a21ee7ae49344e7336d666bdba6

 

이제 어떤 값을 P1_2에 넣어야 ANS가 나오는지 계산한다.

P1 = 11111111111111111111111111111111 ddf56486478a6f39673B303030303030

 

P1을 서버에 전송함으로써, 우리가 원하는 태그 값을 얻을 수 있다.

TAG = 04e46eb38401a4727f15967a29784f17

 

위에서 얻은 CHIPER값과 TAG값을 Execute의 입력 값으로 넣으면 플래그를 얻을 수 있다.

Flag: CODEGATE2020{F33D1NG_0N1Y_H4LF_BL0CK_W1TH_BL0CK_C1PH3R}

'Hack > 리버싱' 카테고리의 다른 글

Codegate2020 Preliminary: Verifier  (0) 2020.02.22
Windows Exception  (0) 2020.01.18
[CSAW 2017] tablez  (0) 2017.09.20
[Codegate 2016] compress  (0) 2017.05.20
[CodeEngn] Challenges : Basic 01  (0) 2016.12.20
posted by Nehoy