leg 라는 문제이다.
지금껏 Intel 기반의 어셈블리를 보았는데
이번에는 다른 기반의 아키텍쳐 ARM을 보게된 계기가 되었다.
(leg 문제)
leg 문제 화면이다.
(leg문제 화면)
들어가보면 leg라는 프로그램과 flag 파일이 있다.
(leg 문제 접속)
처음보는 ARM 어셈블리지만 함수의 리턴값이 어떻게 넘어오는지 확인하기 위해 소스 asm 코드를 보았다.
(leg.asm)
함수를 호출하고 r0 레지스터의 값을 옮겨 담고있는 모습을 포착하였다.
r0 레지스터에 리턴값을 던지는 것 같다.
그렇다면 우리는 이제 r0를 추적하면 된다.
(key1)
먼저 Key1
pc 값을 r3에 넣고 그 값을 r0에 넣는다.
pc라는 것을 찾아보니 Program Counter 레지스터라고 다음 실행할 명령어의 주소를 담고 있는 레지스터라고 되어있다.
그렇다면 pc를 담고 있는 명령어에서 다음 주소는 8ce0 이므로 key1 = 8ce0
그 다음 Key2
(Key2)
pc값을 r3에 넣고 4를 더한다.
즉 r0 = 8d06 + 4
마지막 Key3
(key3)
lr 이라는 것을 살펴보니 함수가 호출되기 전에 복귀 주소를 lr 레지스터에 저장하고 넘어온다고 한다.
ARM 에서는 함수 호출할때 스택을 쓰지않고 lr 레지스터를 이용하나보다.
(lr 값)
복귀 주소를 확인!
이 값을 전부 더해주면 끝!
(오답)
틀렸다...
아무리 생각해도 맞는데.! 틀린게 있다면 pc값 계산이었을까?
찾아보니 ARM에서 pc값 계산이 조금 다르다.
ARM에서는 명령실행할때 단계가 4단계가 된다.
fetch -> decode -> execute -> write
예를 들어 1 -> 2 -> 3 이라는 명령어가 있고
1 명령어가 execute 단계라면
그 다음 명령어 2는 decode 단계에 있고
그 다다음 명령어 3는 fetch 단계에 들어서게 된다.
pc는 fetch 할 주소를 담고 있다.
key1의 pc 값 계산을 다시보면
(key1 pc값)
0x00008cdc 의 주소가 실행 단계에서 pc값을 r3에 넣는 것이다.
여기서 0x00008ce0 주소는 decode 단계이고
0x00008ce4 의 주소가 fetch 될 주소이다.
그러므로 fetch될 주소인 0x00008ce4의 주소가 pc값이 된다.
이런식으로 계산을 하게 되면 정답을 찾을 수 있게 된다.
(문제 해결)
'WarGame > 500 Project' 카테고리의 다른 글
(51/500) pwnable.kr - shellshock (0) | 2017.07.11 |
---|---|
(50/500) pwnable.kr - mistake (0) | 2017.07.10 |
(48/500) pwnable.kr - random (0) | 2017.07.06 |
(47/500) - pwnable.kr - passcode (0) | 2017.07.06 |
(46/500) - pwnable.kr - flag (0) | 2017.07.05 |