
MainActivity 클래스에서 "Success!" 문자열을 포함한 구문을 확인했다
해당 조건문 만족 조건 확인을 위해 해당 코드를 분석한다
해당 코드에서 'native' 키워드를 확인할 수 있었다
- native 키워드?
- Java에서 '네이티브 메소드'를 나타냄
- Java가 아닌 다른 프로그래밍 언어, 주로 C나 C++로 작성되어 있으며, Java Native Interface(JNI)를 통해 Java 코드 내에서 호출됨
- 함수 명명법
- Java_<패키지명>_<클래스명>_<함수명>
조건문 만족을 위해서는 a() 메소드의 반환값이 true여야하는데, a() 메소드는 bar() 메소드의 결과를 반환하고 있기 때문에 bar() 메소드의 분석이 필요하다
그러나 bar()메소드는 네이티브 메소드이기 때문에 현재 상태에서는 분석이 어렵다
분석 대상 파일 확보완료
IDA 에서 우리가 분석하고자 하는 코드를 찾았다
해당 부분 분석 시작
아래 조건문에서 v3와 s2의 값을 처음 23개 까지 비교하여 일치한다면 result 값을 1로 설정해주고 있음을 확인할 수 있다
- strncmp : 두 문자열을 비교, 같으면 0을 반환한다
- 여기서는 '!' 연산자를 이용하여 true(1)가 되도록하여 if 문을 만족시키도록 하였다
이때 상단을보면 데이터가 쌓이는 것을 확인할 수 있고, 어셈블리어에서 문자는 Null byte를 만나기 전까지 하나의 문자열이다
특정 보안 값(__readgsdword) 을 사용한 v12를 제외한 s2 ~ v11은 하나의 문자열이라는 것
각 데이터의 값을 확인
대부분의 x86 아키텍처는 메모리에 리틀 엔디언 방식으로 데이터를 저장한다
따라서 해당 문자열을 빅 엔디엔 방식으로 변환하면
"Thanks for all the fish" 라는 문자열을 얻을 수 있다

jasx-gui를 사용하여도 확인할 수 없는 소스코드가 있는 경우 IDA 를 사용한 어셈블리어 분석을 통해 키 값을 획득할 수 있었다