leg.c 파일의 main() 함수 소스를 보면 사용자 입력값이 key1(), key2(), key3() 함수 각각의 반환값의 합과 같으면 flag 내용을 읽어 출력시켜 준다.
위는 key1() 함수의 c 소스 코드이다.
ARM에서는 PC(Program Counter) 레지스터가 EIP 레지스터와 비슷한 역할을 한다. 하지만 Pipe Lining 기법을 이용해 효율성을 극대화하기 때문에 항상 PC는 Execute 단계보다 4byte 앞선 지점을 가리킨다.(PC는 항상 Fetch 지점을 가리키게 되고, 다다음 Instruction을 의미한다.)
따라서 위의 분석 결과화면에서 'mov r3, pc' 라인의 pc는 0x00008ce4의 값을 가지고 있고 r0 레지스터에는 일반적으로 함수의 반환값을 저장하기 때문에 key1() 함수는 '0x00008ce4' 를 반환한다.
key2() 함수를 보면 pc값을 r3 레지스터에 넣고 4를 더해 반환한다. 따라서 key2() 함수의 반환값은 0x00008d0c이다.
key3() 함수를 보면 lr(Link Register)의 값을 r3 레지스터에 넣고 반환하게 되는데, Link Register는 서브 루틴 함수에서 되돌아 갈 주소를 지정해 놓는 용도로 쓰는 레지스터이다.
따라서, key3() 함수가 종료되고 돌아갈 main() 함수의 주소가 반환될 것이다.
main() 함수를 보면 key3() 함수가 종료되고 실행될 주소는 0x00008d80 임을 알 수 있다.
leg 실행파일에서 10진수 정수 형태로 입력 받으므로 108400을 입력해보자.
위와 같이 flag를 출력했다.
'Wargame > Pwnable.kr' 카테고리의 다른 글
Pwnable.kr simple login-50pt (0) | 2017.05.07 |
---|---|
Pwnable.kr brainfuck-150pt (0) | 2017.05.07 |
Pwnable.kr asm-6pt (0) | 2017.04.23 |
Pwnable.kr cmd2-9pt (0) | 2017.04.19 |
Pwnable.kr cmd1-1pt (0) | 2017.04.19 |