security/포너블 - pwnable.kr

pwnable.kr - [Toddler's Bottle] col

민사민서 2023. 2. 5. 05:03
from pwn import *
s = ssh(user="col", host="pwnable.kr", port=2222, password="guest")
argv1 = ["" for i in range(2)]
argv1[1] = p32(0x6c5cec8) * 4 + p32(0x6c5cecc)
''' 비효율적이지만 little endian으로 한 바이트씩
argv1[1] = (chr(int(0xc8))+chr(int(0xce))+chr(int(0xc5))+chr(int(0x6)))*4
argv1[1] += (chr(int(0xcc))+chr(int(0xce))+chr(int(0xc5))+chr(int(0x6)))
'''
p = s.process(executable="/home/col/col", argv=argv1)

p.interactive()

 

-r-sr-x--- 1 col_pwn col     7341 Jun 11  2014 col
-rw-r--r-- 1 root    root     555 Jun 12  2014 col.c
-r--r----- 1 col_pwn col_pwn   52 Jun 11  2014 flag
// col 소유자는 col_pwn, setuid 설정되어있으므로 flag 읽을 수 있음

#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
   int* ip = (int*)p;
   int i;
   int res=0;
   for(i=0; i<5; i++){
      res += ip[i];
   }
   return res;
}

int main(int argc, char* argv[]){
   if(argc<2){
      printf("usage : %s [passcode]\n", argv[0]);
      return 0;
   }
   if(strlen(argv[1]) != 20){
      printf("passcode length should be 20 bytes\n");
      return 0;
   }

   if(hashcode == check_password( argv[1] )){
      system("/bin/cat flag");
      return 0;
   }
   else
      printf("wrong passcode.\n");
   return 0;
}
// 20byte char 입력받음
// 4byte씩 16진수로 인식해서 다섯번을 더해서 (little endian!!)
// 그 결과값이 0x21DD09EC (4byte)면 된다!
// 0x6c5cec8*5+0x4 = 0x6c5cec8*4 + 0x6c5cecc 이걸
// 4바이트씩 리틀엔디안으로 다섯번 합쳐서 argv[1]로 보낸다