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 |