Root-me Cracking 8번 문제입니다.
ARM Basic 문제네요.
ARM은 Advanced RISC Machine의 약자로
임베디드 기기에 많이 사용되는 프로세서 입니다.
저전력을 사용하도록 설계되어 스마트폰에서 강세를 보이고 있지요.
ARM Operating은 Intel Operating과 약간 다릅니다.
기본적인 ARM 어셈블리를 별도로 공부하셔야합니다.
(구글신에서 검색하시면 자료가 많이 나와요 ㅎㅎ)
그럼 바이너리를 분석하러 가시죠.
Start the Challenge 버튼을 누르시면 ch23.bin 파일을
다운로드합니다.
ARM 바이너리를 디버깅할 환경이 구축되어있지않아
IDA로만 분석하였습니다.
그래프뷰로는 잘 보이지가 않죠.ㅠㅠ
최상단 그래프부터 보시면
변수 선언하고 STMFD 명령을 통해 함수 프롤로그하여
스택프레임을 설정합니다.
이 후 ch23.bin 실행 시 인자값체크를 하여 정상이면
loc_84B0주소로 BEQ 분기문이 실행됩니다
loc_84B0 주소를 보시면 입력한 패스워드 값을 레지스터에
저장하여 strlen 함수를 통해 입력 값 길이 체크를 합니다.
CMP R3, #6 명령을 통해 길이가 6인지 체크 후
동일하면 BEQ 명령을 통해 loc_84F8 로 이동합니다.
loc_84F8 주소부터 입력한 패스워드와 값을 비교하는 구문입니다.
LDR, MOV, RSB, STR 명령들을 통해 연산 및 메모리/레지스터에
데이터를 Load/Store 합니다.
핵심은 #s(입력한 패스워드 문자열) 를 R2 로드시키고
R3+#5(다섯번째 배열의 문자열)을 로드시켜서 CMP R2, R3 비교합니다.
값이 동일하면 BEQ loc_8538로 이동합니다.
동일하게 #s + 1을 R2에 저장. #s에 첫번째 문자열을 R3에 저장하여
CMP R2, R3 비교 후 BEQ loc_8564로 이동합니다.
ADD R3, R3, #3 / LDRB R3, [R3] / ADD R2, R3, #1 명령을 통해
#s 세번째 배열 문자열과 + 1 을 시켜서 R2 레지스터에 저장합니다.
#s를 R3 레지스터에 로드시킨 후 CMP R2, R3 비교하여
BEQ loc_8590 주소로 이동합니다.
loc_8590에서는
ADD R3, R3, #2 / LDRB R3, [R3] / ADD R2, R3, #4 명령을 통해
#s 두번째 배열 문자열과 + 4 하여 R2 레지스터에 저장합니다.
LDR R3, [R11, #s] / ADD R3, R3, #5 / LDRB R3, [R3] 명령을 통해
#s 5번째 문자열을 R3 레지스터에 저장합니다.
CMP R2, R3 비교 후 BEQ loc_85C0로 이동합니다.
loc_85C0 주소에서도 문자열을 비교합니다.
ADD R3, R3, #4 / LDRB R3, [R3] / ADD R2, R3, #2 명령을 통해
#s 네번째 문자열과 + 2 를 더하여 R2에 저장하고,
LDR R3, [R11, #s] / ADD R3, R3, #2 명령을 통해
#s 두번째 배열 문자열과 비교를 합니다.
비교 후 BEQ loc_85F0 주소로 이동합니다
8번문제를 풀려면 마지막 로직이 핵심입니다.
#s 세번째 배열 문자열을 R3에 로드하고
XOR 0x72 AND 0xFF 연산을 합니다.
72는 아스키 문자 "r"입니다.
이 후 #s 여섯번째 배열 문자열을 R3에 저장하고
CMP R3, #0 비교 후 BNE loc_8644 주소로 이동합니다.
여섯번째 배열 문자열을 0과 비교한 후 Not Equals 면 Loser 문자열 출력
그렇다면 s[6]배열은 null값으로 추정할 수 있죠.
지금까지 분석하게 맞는지
Hex-rays 디컴파일러를 이용한 의사코드를 보시죠
abcdefghijklmnopqrstuvwxyz
알파벳 소문자 26개입니다.
s[3] 문자열 "r"을 기준으로 순서를 맞춰
플래그 값을 찾아가면 됩니다.
s[0]은 s[3] + 1 "s"
s[0] + 1 = s[1] 이니 "t"
s[0] = s[5]는 동일
s[2] + 4 = s[5] " o"
이렇게 찾아가보면 6글자의 플래그 문자값을 찾을 수 있습니다.
'War-Game > Root-me' 카테고리의 다른 글
root-me challenges - App System : 1 ELF x86 - Stack buffer overflow basic 1 (0) | 2019.04.03 |
---|---|
ROOT-ME CHALLENGES - CRACKING : 9 PYC - ByteCode (0) | 2019.04.03 |
ROOT-ME CHALLENGES - CRACKING : 7 ELF - Ptrace (0) | 2019.04.03 |
ROOT-ME CHALLENGES - Web Server : 32 SQL injection - numeric (0) | 2019.04.03 |
ROOT-ME CHALLENGES - CRACKING : 6 ELF - Fake Instructions (0) | 2019.04.03 |