pwnable Toddler`s Bottle - leg
문제파악
어셈블리 코드가 섞여있지만 main함수만 살펴보면 입력값과 keyn함수의 실행값들의 합이 같게되면 flag를 읽어오는 것을 확인할 수 있다. 각 keyn함수들의 결과값을 알아내어 합산한 값을 넣어주면 될 것으로 보인다.
ARM Assembly
어셈블리 코드를 봐야하기 때문에 ARM 어셈블리를 알아야 한다. 처음부터 끝까지라면 1년이 걸려도 마스터를 하지 못하겠지만 이 문제를 풀기위한 수준의 내용만 살펴본다. 이 문제에서 중요한 것은 함수의 리턴 값은 어떻게 전달되는 가
이다. 이를 알기 위해서 ARM calling convention
을 살펴보면 r0
레지스터에 반환값을 저장하는 것을 알 수 있다. 그렇다면 앞으로 r0
레지스터에 어떤 값이 담기는지 위주로 살펴본다.
key1
어셈블리 코드를 살펴보면 r3의 값을 r0에 넣는 것을 확인할 수 있다. r3의 값은 이전 명령의 pc레지스터 값이 되는데 ARM calling convention
에 따르면 pc는 다음 2번 째 명령어의 주소를 가르키는 것을 확인할 수 있다. 따라서 key1의 반환 값은 0x00008ce4가 된다.
key2
코드가 아까보다는 길지만 우리가 원하는 것은 반환 값이기 때문에 이에 집중해서 보면 간단하다. 이번에도 pc 레지스터의 값을 이용하고 간단하게 4을 더한다. 따라서 key2의 반환 값은 0x00008d0c가 된다.
key3
이 함수는 어셈블리를 보기전에 코드를 보는 것이 더 간단하다. lr 레지스터의 값을 넣는 것을 확인할 수 있다. lr 레지스터는 key3 함수가 반환 후 실행될 주소 값을 가지고 있다. 따라서 어셈블리 코드에서 함수 호출 다음 명령어의 위치값인 **0x00008d80 **이 반환값이 된다.
결론
위에서 분석한 3 함수의 반환값을 더한 값을 입력하게 되면 flag를 확인할 수 있다.
댓글남기기