상세 컨텐츠

본문 제목

SECCON 2015 CTF-RPS

학생일기/리버싱

by jaws99 2020. 11. 3. 14:39

본문

반응형

https://github.com/ctfs/write-ups-2015/tree/master/seccon-quals-ctf-2015/binary/reverse-engineering-android-apk-1

 

ctfs/write-ups-2015

Wiki-like CTF write-ups repository, maintained by the community. 2015 - ctfs/write-ups-2015

github.com

문제 apk를 받을 수 있습니다.

 

write-up을 보니 처음 하는 저도 따라 할 만해 보여서 이걸로 정했습니다.

 

Nox에서 처음 앱을 실행하면 이렇게 나옵니다.

이기면 점수가 1이 오르는데 지면 0점으로 초기화됩니다..

 

jadx로 apk 파일을 확인해보겠습니다.

 

OnClick에서는 Paper, Rock, Scissors 순으로 0,1,2 라고 준 다음

n 컴퓨터 m 사용자로 값을 줍니다.

그리고 Thread로 showMessageTask를 실행합니다.

 

카운트를 올리거나 0으로 만들어서 마지막 if에 카운트가 1000이되면 SECCON{}으로 Flag를 확인할 수 있습니다.

caloc() 함수에서 그 값을 알 수 있는데 native로 프로그래밍 했습니다.

 

apk 파일을 풀어보면 lib 폴더에서 libcalc.so 파일을 확인할 수 있는데,

so 파일을 보려면 hex-ray 디컴파일러 -> IDA + hex rays 같은 게 필요한데 유료라서 알아보니

NSA에서 Ghidra(기드라)라는 걸 만들었다네요. 나중에 한 번 사용해봐야겠습니다.

 

IDA가 없으니 smali분석을 해보겠습니다.

 

apktool을 사용하면 apk를 디컴파일 할 수 있습니다.

 -> java -jar apktool_2.3.4.jar d [apk name] decompile

 

rps\smali\com\example\seccon2015\rock_paper_scissors\

MainActivity smali가 2개 나오는데 내용을 확인해보니 $1에 run 함수가 있어 여기를 수정하면 될 거 같습니다.

 

코드를 찬찬히 읽어보니 저는 v4라는 값이 눈에 띄었습니다.

혼자 LOSE 근처에서 놀고 있습니다. iput이 무슨 뜻인지 확인해보겠습니다.

 

https://hyeonbell.tistory.com/1

v4값을 v1의 필드 cnt에 넣는다고 합니다.

그럼 v4값을 바꿔주면 졌을 때 값이 바뀌겠네요.

 

"const/4 v4, 0x3E7 이렇게 하면 질 때 999로 늘어나겠네"하고 컴파일하려고 했지만 에러 났습니다.

 

https://hyeonbell.tistory.com/1

4는 4비트라서 안되고, 16으로 해야 16bit까지 값을 표현할 수 있습니다.

const/16 v4, 0x3e7 이렇게 해야 합니다.

 

apktool로 다시 컴파일해줍니다.

 -> java -jar apktool_2.3.4.jar b [폴더 경로]  -> compile

 

저는 서명을 jarsigner로 했는데 jdk가 필요합니다. oracle로 설치하기 귀찮다면,

openjdk https://github.com/ojdkbuild/ojdkbuild

설치하는 법 https://jinddeok.tistory.com/49


jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore [keystore경로] [apk file경로] testkey

 

한 번 지면 999로 갔다가 이기면 FLAG가 나옵니다.

여러 가지 방법으로 smali를 바꿔봐도 좋을 것 같습니다.

반응형

'학생일기 > 리버싱' 카테고리의 다른 글

abex crackme #1  (0) 2023.07.12

관련글 더보기