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 at 0x8510
(gdb) r
Starting program: /data/local/s/a.out
input password : wwwww

Breakpoint 1, 0x00008510 in main ()
(gdb) set *0x8514 = 0x90909090

0x00008514 <+244>:   90 90 90 90     umullsls        r9, r0, r0, r0   <--- NOP

(gdb) c
Continuing.
right!
[Inferior 1 (process 10098) exited with code 012]

잘 동작 합니다.



+ Recent posts