푸르미르

pwnable.kr 8. leg 본문

SECURITY/pwnable

pwnable.kr 8. leg

((•_•)) 2021. 4. 28. 15:00

문제
파일 다운

 

leg.c 파일을 함 보자

 

scanf를 사용해 key 값을 입력하고, 그 key값이 key1()+key2()+key3()과 동일하면, flag 파일이 open 되는 형식이다.

 

cat leg.asm

 

뜯어서 보자.

 

key1

c코드를 보았을 때, mov명령을 통해 pc값을 r3에 넣는 것을 확인 할 수 있다.

디스어셈블 코드를 보았을 때, mov를 통해 r3에 pc값을 넣은 후 r0에 r3값을 넣는 것을 확인 할 수 있다. 

 

그렇다면 pc란 무엇일 까.

pc는 레지스터 중 하나로 다음 인출될 명령어의 주소를 갖고 있는 아이이다. 

cpu는 하나의 명령을 실행할 때 다으마과 같은 과정을 거친다.

1. fetch - 메모리에서 명령어를 가져온다.

2. decode - 명령어 읽기 및 해독, 레지스터를 읽는다.

3. excute - 연산 수행, 주소 계산

 

2개의 opcode를 실행하면 fetch > decode > execute > fetch > decode > execute로 총 6번의 작업을 

해야한다. 하지만 pipe line을 활용한다면 4번으로 줄일 수 있다.

1 2 3 4
fetch decode execute  
  fetch decode execute

이렇게 병렬적으로 한다면 2개의 opcode를 실행할 때 6번이 아닌 4번으로 줄일 수 있게 된다.

 

만약 내가 지금 execute 과정 중에 있다면 fetch명령의 주소는 다다음 주소가 된다. 

pc는 다다음 명령의 주소가 들어간다는 것!

 

현재 명령 mov r3, pc 명령의 다다음 주소인  0x00008ce4가 pc의 값이다. 

key1의 결과값은 0x00008ce4

다음으로 key2를 확인해보자!

 

mov명령으로 pc값을 r3에 넣고 있다. 그 다음 adds r3, #4 명령을 통해 r3 값에 4를 더해주고 있다.

즉, pc 값은 0x0008d08이며, 여기에 4를 더해주면 0x00008d0c가 된다.

key2 결과값은 0x0008d0c

 

다음 key3를 보자.

 

mov명령으로 lr 값을 r3에 넣어준 뒤, r3 값을 r0에 넣어주고 있다.

lr은 함수 호출 전 다시 돌아갈 주소를 담고있다.

그렇다면 lr은 0x00008d80이다. 

key3 결과값은 0x00008d80

 

위의 3가지 결과값들을 다 더해주면 된다.

답: 0x1a770 -> 108400

 

My daddy has a lot of ARMv5te muscle!

 

'SECURITY > pwnable' 카테고리의 다른 글

pwnable.kr 10. shellshock  (0) 2021.05.05
pwnable.kr 9. mistake  (0) 2021.04.28
pwnable.kr 7. input  (0) 2021.04.06
pwnable.kr 6.random  (0) 2021.04.06
pwnable.kr 5.passcode (문제 파악)  (0) 2021.03.31