ARM에서의 조건 분기에 대해 알아보기 위해 아래와 같은 소스를 컴파일하여 실행하였습니다.
바이너리를 IDA에 넣고 디스어셈블링하였습니다.
strcmp 로 문자열을 비교해서 같으면 플래그가 0으로 설정됩니다.
BNE는 Branch Not Equal 로 같지 않으면 분기하라는 의미인데 0x852C를 보면 wrong이 있습니다.
주목해볼만한 것은 인텔 아키텍쳐와는 다르게 바이트 단위가 아닌 줄 단위로 분기한다는 것입니다.
이것은 4바이트 단위로 해석하는 arm-mode 특성 때문에 가능한 것이지요. 개인적으로 정말 마음에 듭니다.
무조건 right 이 출력되게 아래와 같이 코드 패칭을 하였습니다.
해당 라인에 NOP를 의미하는 0x90(2021.1.28 수정 : arm에서의 nop는 0x00 0xf0 0x20 0xe3입니다.)을 채워넣었습니다. 패치 후에 해당 부분이 정상적으로 디스어셈블링이 되지 않았습니다.
(gdb) break *0x8510 Breakpoint 1, 0x00008510 in main () 0x00008514 <+244>: 90 90 90 90 umullsls r9, r0, r0, r0 <--- NOP (gdb) c |
잘 동작 합니다.
'Android Linux' 카테고리의 다른 글
Visual Studio에서 ARM-Android 라이브러리를 쉽게 빌드해보자 (0) | 2014.10.17 |
---|---|
Simple Stack Buffer Overflow in ARM (0) | 2014.08.01 |
폰에 SSH 서버를 설치하여 보다 편리한 환경 구축하기 (0) | 2014.06.17 |
gdb를 이용한 hello world 분석 (0) | 2014.05.30 |
안드로이드 폰에서 개발 및 디버깅 환경 세팅하기 (5) | 2014.05.29 |