pc 레지스터에대한 이해가 필요하다.
cpu가 하나의 명령어를 수행할 떄 fetch -> decode -> execute의 과정을 거친다.
2개의 opcode를 실행하려면 fetch -> decode -> execute -> fetch -> decode -> execute 총 6번의 작업이 필요하다.
그러나 pipe line 을 통해서
1 2 3 4
fetch decode execute
fetch decode execute
위처럼 병렬적으로 단계를 수행하게 된다. 2개의 opcode를 실행할 때 4번의 작업으로 실행시키는 것이다.
pc 레지스터는 fetch할 주소를 담고 있다.
현재 명령어가 execute 즉 실행단계라면, 다음 명령어는 decode 단계이고, 그 다음 명령어는 fetch 단계이다.
그렇기 때문에 pc레지스터에는 실행시킬때 다다음번째 명령어의 주소를 담고 있다.
leg 문제풀이
key1
적용시켜보면 0x00008cdc에서의 pc레지스터에는 그 다음다음 번째 주소인 0x00008ce4가 들어가 있다.
key2
pc는 0x00008d04의 다음다음 주소인 0x00008d08이고, 다음 명령어를 보면 adds r3, #4가 있다.
그렇기때문에 key2는 0x8d0c 이다.
key3
lr 레지스터는 ret에 있는 주소값을 가져온다. 즉 key3 함수가 끝난후 실행될 opcode의 주소를 받아온다.
0x8d80이다.
key1 + key2 + key3 를 하면 총 합은 108400이다.
플래그획득
============================================================================================
새로보는 레지스터들이 많았다. 배경지식필요 공부 필요
어셈코드를 잘읽을 줄 알아야한다. -> 어셈코딩공부를 하자.
'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글
horcruxes (0) | 2018.12.21 |
---|---|
cmd1 (0) | 2018.12.21 |
lotto (0) | 2018.12.19 |
random (0) | 2018.12.19 |
blackjack (0) | 2018.12.19 |