ssoL2 TISTORY

pwnable.kr [passcode] 본문

challenge/pwn

pwnable.kr [passcode]

ssoL2 2021. 6. 29. 21:53

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 
#include 

void login(){
        int passcode1;
        int passcode2;

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

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

        printf("checking...\n");
        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 : ");
        scanf("%100s", name);
        printf("Welcome %s!\n", name);
}

int main(){
        printf("Toddler's Secure Login System 1.0 beta.\n");

        welcome();
        login();

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

 

 

 

 

이 문제는 bof를 이용해서 주소지정자(&)없는 변수 조작+plt.got 조작 문제였음

가장 큰 문제는 scanf에 주소지정자(&)가 없다는 것

&가 없다는 의미는 

scanf("%d", passcode1);

=> passcode1에 저장된 쓰레기 값이 주소가 되고, 그 주소에 입력한 정수를 저장하겠다는 의미

 

 

passcode1은 welcome()에 있는 name[100]의 bof로 조작 가능하므로,

passcode1을 내가 원하는 주소로 바꿀 수 있는거고, scanf로 결국 "내가 원하는 주소" "내가 원하는 걸" 넣을 수 있다는 의미

 

 

scanf 다음에 있는 fflush(stdin);도 잘 봐야하는게,

리눅스에서 잘 사용하지 않는 함수임 -> 이걸 이용해서 무언가 하라는 의미

-> scanf(password1)에서 "내가 원하는 주소"에 "내가 원하는 걸" 넣고, 바로 fflush가 실행되니까 

fflush got 함수 주소에 system 실행 주소를 넣으면 되겠다~ (왜냐하면 system을 일으키는 것이 이 문제의 목표니까)

 

 

 

1. bof 주소 알기

아래는 welcome()의 name 위치 => ebp-0x70

아래는 login()의 passcode1 위치 => ebp-0x10

따라서 bof 거리는  0x70-0x10=0x60=96만큼 떨어져있다. 이만큼 쓱싹 채우고, 바로 다음 오는게 passcode1 변수임

 

 

 

 

2. passcode1에 채워넣을, 내가 원하는 주소 = fflush got 주소

아래와 같다~ 0x804a004

 

 

 

3. 마지막으로, 내가 원하는 주소에 채워넣을, 내가 원하는 내용!!!

fflush got주소에 system 넣기로 했쥬

system안에 있는 변수까지 알아야 하므로 call부분이 아닌 위에 부터 쓱싹해야죠 따라서 0x80485e3

 

 

 

준비는 끝났다~

payload는 dummy*96 + fflush got주소 + system실행 주소 일텐데,,,,,,,,,,,,,,,

이때, name 배열의 크기가 100 byte이므로 위처럼 쓰면 96 + 4 + 4로 100을 초과함 (주소는 총 4byte이니까)

따라서 dummy*96 + fflush got주소만 쓰고

그 다음에 직접 system실행 주소를 입력하면 되겠다.

 

 

그래서 쓱싹 쓰고나서 형광펜 친 것을 직접 입력한 상황이다.

갑자기 134514147이 왜나오냐면~ scanf로 내가 원하는 걸 입력할 때 "정수"로 받기 때문에(%d)

해당 system 주소 값을 정수로 변환해서 입력해야 정상적으로 입력이 완료된다~ 끝!!

 

 

 

 

'challenge > pwn' 카테고리의 다른 글

pwnable.kr [input]  (0) 2021.06.30
pwnable.kr [random]  (0) 2021.06.30
[FTZ] LEVEL 18 풀이  (0) 2021.02.23
[FTZ] LEVEL 17 풀이  (0) 2021.02.23
[FTZ] LEVEL 16 풀이  (0) 2021.02.01
Comments