- #include <stdio.h>
- #include <fcntl.h>
- int key1(){
- asm("mov r3, pc\n");
- }
- int key2(){
- asm(
- "push {r6}\n"
- "add r6, pc, $1\n"
- "bx r6\n"
- ".code 16\n"
- "mov r3, pc\n"
- "add r3, $0x4\n"
- "push {r3}\n"
- "pop {pc}\n"
- ".code 32\n"
- "pop {r6}\n"
- );
- }
- int key3(){
- asm("mov r3, lr\n");
- }
- int main(){
- int key=0;
- printf("Daddy has very strong arm! : ");
- scanf("%d", &key);
- if( (key1()+key2()+key3()) == key ){
- printf("Congratz!\n");
- int fd = open("flag", O_RDONLY);
- char buf[100];
- int r = read(fd, buf, 100);
- write(0, buf, r);
- }
- else{
- printf("I have strong leg :P\n");
- }
- return 0;
- }
ARM에서 pc(program counter)의 값이r0에 남는다.
r0는 return값이 들어간다.
program counter에는 다음에 실행할 명령어의 주소가 들어있다.
즉 pc는 사용된 주소 +4byte를 가지므로
key1에는 다음 명령어가 실행될 주소인 8ce4가 된다.
pc의 값을 r3에 넣고 를 더해주는 것을 확인할 수 있다.
그렇다면 8d04 + 4 + 4 == 8d0c가 key2의 값이 된다.
lr을 r3에 넣고 r3을 r0에 넣는것을 확인할 수 있다.
lr은 함수 호출시 리턴될 값을 의미한다.
main함수를 따라가보자.
key3은 8d80이 된다.
key1 + key2 + key3 = key이고 정수를 인자로 받으므로 key=108400
앙기모띠
'pwnable > pwnable.kr' 카테고리의 다른 글
pwnable.kr -cmd1 (0) | 2016.09.25 |
---|---|
pwnable.kr -lotto (0) | 2016.09.25 |
pwnable.kr -random (0) | 2016.09.25 |
pwnable.kr -passcode (0) | 2016.09.24 |
pwnable.kr -echo1 (0) | 2016.09.23 |