항상 intel기반 어셈만 보았다면 이번에는 arm기반의 어셈을 분석할 수 있냐는 문제이다.
c 코드를 보면 대충 답이 다 나와 있다. key1,2,3 공통적으로 r3를 이용하는 걸로 봐서 함수내부에서는 r3에 어떠한 값을 넣을 것 같다.
주어진 gdb disas main을 보면 함수 외부에서는 r0에 key값을 담아와 더해주는 과정을 볼 수 있다.
arm에선 pipeline기법이 있다. cpu내부의 파트별로 fetch ,decode ,excute 기능을 하는 부분이 각각 달라서 가능한 기법이다. pc(program counter)는 fetch를 기준으로 그값을 담기 때문에 0x00008cdc가 excute중이라면 pc는 fetch중인 0x00008ce4를 담고 있을것이다.
그리하여 key1값은 0x8ce4가 된다.
key2()함수 내부를 보면 0x8d04에서 pc값을 r3에 넣는데 여기서어 pc값은 몇일까? 0x8d08이다.
0x8d04부터 2 byte씩 명령어를 fetch하기 때문에 pc도 2byte씩 증가하기 때문이다.
0x8d06 줄에 r3에 +4를 해주어서 pc+4가 된다.
즉, key2값은 0x8d0c가 된다.
위 코드를 보면 알다시피
key3값은 간단히 lr 값이기 때문에 0x8d84가 된다.
flag값을 구하기 위해서는 key1+key2+key3를 10진수 형태로 입력해주면 된다.
'System Hacking > pwable.kr' 카테고리의 다른 글
09.Pwnable mistake (0) | 2018.02.16 |
---|---|
12.Pwnable blackjack (0) | 2018.02.16 |
06.Pwnable random (0) | 2018.02.15 |
05.Pwnable passcode (0) | 2018.02.15 |
04.Pwnable flag (0) | 2018.02.13 |