관리 메뉴

Information Security

Uncrackable1 - 암호화 본문

모바일/Frida

Uncrackable1 - 암호화

HackingPractice 2020. 12. 18. 22:32

이번 문제는 암호를 복호화하는 것이다.

그림 1-1 Uncrackable

 

임의 값인 test를 입력한 후 검증 버튼을 클릭하면 다시 시도해보라는 메시지를 보여준다. 

그림 1-2 Nope

jadx 프로그램을 통해 text search에서 Nope 검색했다.

그림 1-3 Text search

MainActivity 클래스 내부에 Verify 메서드가 있고 해당 메서드 내부에 찾은 메시지를 볼 수 있다.

성공하면 Success! 문자가 실행된다. obj의 변수에 String 객체에 들어간다. a클래스 내부의 a메서드 내부의 인자 값으로 obj가 들어간다. true가 나오면 보이는 Success! 메시지가 보이고 false가 나오면 Nope 메시지를 보여준다.

그림 1-4 MainActivity

a클래스의 a메소드에 들어가면 string객체를 받고 있고 입력했던 값이 str에 들어가서 활용이 된다. bArr 더블클릭하면 byte 배열로 선언해 준 다음에 try 구문으로 실행하고 있다.

그림 1-5 uncrackable1.a

a를 따라가보면 sg.vantagepoint.a에 있는 패키지 내부에 있는 a클래스 내부의 a메서드를 확인할 수 있다. byte 배열로 두 가지를 받고 있다. 내부에는 AES 암호화 방식을 이용해서 만들고 있으며 암/복호화 단계가 이뤄지고 있다.

여기서 해결 할 수 있는 방법을 2가지로 나눌 수 있다.

1. a.a.(obj)를 무조건 true값 반환하여 이상한 값을 넣어도 통과될 수 있도록

2. str(우리가 입력했던 문자)를 암호화 과정이 없으니 Abrr과 비교하고 있다. Abrr은 복호화된 일반 문자 값(secret string)이 될 것이다. 이것을 찾기 위해서는 bArr이 해당 a.a.a메서드에서 반환된 값을 넣어주기 때문에 메서드를 후킹 해서 복호화된 값을 찾아서 올바른 값을 입력 후 성공이 나오도록 한다.

그림 1-6 vantagepoint.a

첫번째 방법

1. 제일 쉬운 방법 : a.a 메서드를 후킹 하여 안의 내용을 모두 지워버린 후 return true;를 반환하도록 한다.

함수를 재작성할 것이기 때문에 Java.use를 사용한다.

그림 1-7 자바스크립트

자바스크립트를 인젝션 시키면 콘솔 로그와 함께 성공 메시지를 확인할 수 있다.

그림 1-8 frida

​test1234 입력 시 성공 메시지를 보여준다.

그림 1-9 Success!

두번째 방법

2. 다시 처음으로 들어와 MainActivity에서 확인해 보자

a.a(obj) 값을 넣어서 true가 반환되면 성공이라는 문자가 출력된다. 임의의 값을 넣어 true가 반환되는 것이 아닌 올바른 값을 넣어서 성공하는 구문을 출력하게 할 것이다.  bArr과 비교하고 인자 값 바이트 배열 두 개를 주고 있다.

그림 1-10 Mainactivity

입력한 값을 ASCII 코드를 출력하는 소스코드이다.

그림 1-11 자바스크립트 코드

앱에서 입력한 값을 ASCII 코드로 출력해준다.

그림 1-12 ASCII

fromCharCode()는 아스키코드를 받아서 문자열로 구성하는 역할을 해주는 함수다.

그림 1-13 자바스크립트 코드

secret string 값은 I want to believe임을 알 수 있다.

그림 1-14 secret

​I want to believe 값을 입력하면 Success! 메시지를 보여주는 것을 알 수 있다. 

그림 1-15 정답