1. #include <stdio.h>  
  2. #include <fcntl.h>  
  3. int key1(){  
  4.     asm("mov r3, pc\n");  
  5. }  
  6. int key2(){  
  7.     asm(  
  8.     "push   {r6}\n"  
  9.     "add    r6, pc, $1\n"  
  10.     "bx r6\n"  
  11.     ".code   16\n"  
  12.     "mov    r3, pc\n"  
  13.     "add    r3, $0x4\n"  
  14.     "push   {r3}\n"  
  15.     "pop    {pc}\n"  
  16.     ".code  32\n"  
  17.     "pop    {r6}\n"  
  18.     );  
  19. }  
  20. int key3(){  
  21.     asm("mov r3, lr\n");  
  22. }  
  23. int main(){  
  24.     int key=0;  
  25.     printf("Daddy has very strong arm! : ");  
  26.     scanf("%d", &key);  
  27.     if( (key1()+key2()+key3()) == key ){  
  28.         printf("Congratz!\n");  
  29.         int fd = open("flag", O_RDONLY);  
  30.         char buf[100];  
  31.         int r = read(fd, buf, 100);  
  32.         write(0, buf, r);  
  33.     }  
  34.     else{  
  1.         printf("I have strong leg :P\n");  
  2.     }  
  3.     return 0;  
  4. }  

r0? r3? 
레지스터를 보아하니 ARM 이다.

문제를 보면 key1 + key2 + key3 == 입력값 이면 flag를 출력한다.
어셈을 보면서 하나하나 따라가보자


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

+ Recent posts