KDHzoot's Github

Code for study, project, etc

자세히보기

정보보안/pwnable.kr

[pwnable.kr] leg

kdhzoot 2018. 11. 8. 22:09

leg문제는 arm을 보여주기위한 문제이다.

어셈블리어 코드인데 어딘가 다르다.

arm 기반으로한 코드이기 때문이다.



우리가 알아야 되는 것은 key1, key2, key3 함수의 리턴값이다.



코드를 보면 알겠지만 함수가 끝난뒤 항상 r0 레지스터에 있는 값을 어딘가로 복사한다.

여기서 우리는 함수의 리턴값이 r0에 저장된다는 것을 알 수 있다.


그럼 이제 key함수들에서 r0이 어떻게 조작되는지만 알면 된다.




key1 함수이다. r0는 r3의 값을 덮어쓰고 r3는 pc의 값을 덮어쓴다.

따라서 리턴되는 값은 0x00008cdc에서 pc값이다.

여기서 pc란 프로그램 카운터의 줄임말로 다음으로 실행되어야 하는 명령어를 가르킨다.


여기서 주의해야될 점은 arm에서의 pc계산 방법이다.

arm에서 명령 실행단계는 4단계로 나눠진다.


fetch -> decode -> execute -> write


따라서 

mov r3, pc 가 execute과정일 때

mov r0, r3 는 decode과정으로 들어가고

sub sp, r11 은 fetch과정에 들어간다.


이때, arm에서 pc는 fetch되는 함수의 주소를 가지고 있므로 key1의 리턴값은  

0x8ce4이다.





key2 함수를 보자.

r0는 r3값으로 덮어씌워지고 r3값은 pc값을 받은 뒤 4가 더해진다.

따라서 key2의 리턴 값은 0x8d0c이다.




key3 함수이다. r0는 r3를 덮어쓰고 r3는 lr을 덮어쓴다. 여기서 lr은 return adress로 함수가 끝났을 때

실행되는 다음 코드의 주소이다.


따라서 main함수를 잘 살펴보면 key3의 리턴 값은 0x8d80



셋다 더하면 0x1A770

10진수로 ‭108400‬



exploit



'정보보안 > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] shellshock  (0) 2018.11.09
[pwnable.kr] mistake  (0) 2018.11.08
[pwnable.kr] input  (0) 2018.11.08
[pwnable.kr] random  (0) 2018.11.08
[pwnable.kr] passcode  (0) 2018.11.08