본문 바로가기

시스템/pwnable.kr

leg

leg




leg.asm

 


   


leg.c


 ssh leg@pwnable.kr -p2222 하면

                             

쉘이 나온다.


디렉토리 목록을 봅시다.


leg 한 번 실행해보자.


조건

key1()+key2()+key3() 값이 key와 동일


이 어셈블리는 이제껏 봐왔던 intel환경과는 다른  ARM 어셈블리이다.

자세한 건 정리했던 글 참조


key1 함수


pc : 다음에 실행해야 할 명령어의 메모리 주소

{r0}={r3}=pc=0x8ce0


key2 함수

 

r3 값=0x8d06

r0 값 = r3값+4 =0x8d0a


key3 함수

main

       


lr레지스터 : ret 같은 역할

lr 값=0x8d80


왜 r0?


결국 r2 값(key3)+=r4 값(key1)+r3 값(key2)

r2 값과 r3 값(scanf 한 수) 비교


0x8ce0+0x8d0a+0x8d80=0x1a76a=108394

근데 이게 답이 아니다.


왜?

cpu가 명령어를 실행할 때 fetch -> decode -> execute 과정을 가진다.

cpu의 효율을 위해 fetch와 decode와 execute를 동시에 수행하게 되는데,

때문에 명령어를 execute할 때 그 다음 명령어는 decode되고 또 다음 명령어는 fetch된다.


즉,

pc가 cpu가 현재 실행하고 있는 명령어의 주소를 가리킬 때,

pc=현재 명령어 주소, decode=이전 명령어의 주소, execute=그 이전 명령어의 주소

pc=다음 명령어 주소, decode=현재 명령어 주소, execute=이전 명령어의 주소

pc=그 다음 명령어의 주소, decode=다음 명령어 주소, execute=현재 명령어의 주소

이런 식으로 진행되기 때문에

key1 함수의 mov r3, pc 명령이 실행될 때의 pc 값은 두 번째 이후 명령어의 주소이다.


최종 답

 0x8ce4+0x8d0c+0x8d80=0x1a770=108440


  




'시스템 > pwnable.kr' 카테고리의 다른 글

shellshock  (0) 2018.11.05
mistake  (0) 2018.11.05
input  (0) 2018.11.05
random  (0) 2018.11.04
flag  (0) 2018.11.04