Hey! check out this C implementation of blackjack game!

I found it online

* http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html


I like to give my flags to millionares.

how much money you got?



Running at : nc pwnable.kr 9009



첫 화면이다


룰은 대충 이렇다

100만점을 얻어야 flag를 준다는데

1pt인데 너무 길다ㅠㅠ


룰을..영어를 해석해보자.........

1. 이 프로그램은 카드를 랜덤으로 생성한다


2. 각 카드는 하나의 값을 가진다 

숫자카드는 1~10까지

J,Q,K카드는10의 값을

에이스 카드는 11의 값을 가진다

이게임의 목표는 카드 값들의 합을 21로 맞추는것


3.첫번째 두개의 카드를 보고 hit 과 stay를 결정할 수 있다.

hit은 카드의 숫자를 더하고 stay는 당신을 안전하게 한다(?)

카드값이 21을 넘으면 당신의 패배다



ㅁ나ㅣ어리ㅏ 게임이 이해가 안된다

http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html

여기에 소스가 있다 


한꺼번에 배팅을 많이하면 될것같아서 betting하는 함수를 찾아봤다

반복문이 없어서 큰수를 두번써주면 한번에 100000000을 벌수 있다


플래그를 뱉었다!!





'war game > pwnable.kr' 카테고리의 다른 글

pwnable.kr cmd1 1pt  (0) 2016.10.11
pwnable.kr lotto 2pt  (0) 2016.10.11
pwnable.kr coin1 6pt  (0) 2016.10.11
pwnable.kr shellshock 1pt  (0) 2016.10.11
pwnable 1pt mistake  (0) 2016.10.10


Mommy, I wanna play a game!

(if your network response time is too slow, try nc 0 9007 inside pwnable.kr server)


Running at : nc pwnable.kr 9007




python소켓프로그래밍을 배워와야 겠습니다



python re모듈(정규식) https://docs.python.org/3/library/re.html


python 3.5사용중인데 python3.5에서는 socket.send socket.recv를 object bytes로 송수신 하는데

socket.send(message.encode())로 보내줫는데 보내주는 값을 문자열로 받아서 format eroor를 반환한다..

찾아보는중..

이라고 착각하고 삽질 엄청했는데 아님..ㅎㅎ send recv에 문제가 아니라 포트번호를 잘못썼었다..

ㅠㅠㅠ


flag 땄다.. ㅠㅠ


코드




첫 소켓 코딩이었다ㅠㅠ그래서 코드가 좀 더럽긴하다

포트때문에 어이없게 고생했지만 뿌듯 ㅎㅎ

            



'war game > pwnable.kr' 카테고리의 다른 글

pwnable.kr cmd1 1pt  (0) 2016.10.11
pwnable.kr lotto 2pt  (0) 2016.10.11
pwnable.kr blackjack 1pt  (0) 2016.10.11
pwnable.kr shellshock 1pt  (0) 2016.10.11
pwnable 1pt mistake  (0) 2016.10.10

Mommy, there was a shocking news about bash.

I bet you already know, but lets just make it sure :)



ssh shellshock@pwnable.kr -p2222 (pw:guest)




#include <stdio.h>

int main(){

setresuid(getegid(), getegid(), getegid());    //ruid(실재 사용자realuser), euid(유효사용자effectiveuser), suid(파일 소유자setuser)를 getegid()(egid)로                                                                     세팅

setresgid(getegid(), getegid(), getegid());    

system("/home/shellshock/bash -c 'echo shock_me'");

return 0;

}


일단 코드는 되게 짧네요

이걸 이용해서 flag를 따야하는데.. getegid()가 많이 나오므로 plt를 조작하는 건가 생각하면서 삽질좀 하다가 

'

shellshock가 단순히 문제 이름이 아니라 bash의 취약점이라는 사실을 알게되었다.

CVE-2014-6271이라 불린다고 한다.

자세한 설명은 http://blog.naver.com/PostView.nhn?blogId=renucs&logNo=220144713558




shellshock 취약점 진단을 해보니 취약하다는 결과가 나왔다.

이는 bash에서 함수의 정의를 환경변수로 저장하기 때문에 나오는 취약점인데, 함수의 정의 (){return;}후에 원하는 명령어를 넣어주면 bash가 이 함수 정의를 import할때 뒤의 명령어도 함께 실행시켜준다.

예전에 이 취약점으로 떠들석 햇다고 한다. 지금은 리눅스 버전을 update만 하면 공격이 통하지 않는다.




'war game > pwnable.kr' 카테고리의 다른 글

pwnable.kr cmd1 1pt  (0) 2016.10.11
pwnable.kr lotto 2pt  (0) 2016.10.11
pwnable.kr blackjack 1pt  (0) 2016.10.11
pwnable.kr coin1 6pt  (0) 2016.10.11
pwnable 1pt mistake  (0) 2016.10.10

문제 : 

We all make mistakes, let's move on.

(don't take this too seriously, no fancy hacking skill is required at all)


This task is based on real event

Thanks to dhmonkey


hint : operator priority


ssh mistake@pwnable.kr -p2222 (pw:guest)


mistake.c를 읽어보았다.


#include <stdio.h>

#include <fcntl.h>             fcntl.h헤더에 대한 글 http://www.joinc.co.kr/w/Site/system_programing/File/Fcntl 


#define PW_LEN 10        

#define XORKEY 1


void xor(char* s, int len){

int i;

for(i=0; i<len; i++){

s[i] ^= XORKEY;

}

}


int main(int argc, char* argv[]){

int fd;

if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){ ..**여기서 우선순위로 password를 열수있다. open(~)<0 이 false이므로 fd=false=0

printf("can't open password %d\n", fd);

return 0;

}


printf("do not bruteforce...\n");

sleep(time(0)%20);


char pw_buf[PW_LEN+1];            .pw_buf[11]

int len;

if(!(len=read(fd,pw_buf,PW_LEN) > 0)){  read는 정상실행시 읽은 바이트수 반환이지만, fd=0이면 입력을 받게 된다. 즉 len=~코드는 scanf(%s pw) 

printf("read error\n");

close(fd);

return 0;

}


char pw_buf2[PW_LEN+1];    .pw_buf2[11]

printf("input password : ");

scanf("%10s", pw_buf2);


// xor your input

xor(pw_buf2, 10);        .인풋비트을 1과 xor


if(!strncmp(pw_buf, pw_buf2, PW_LEN)){    .비교해서 같으면 플래그를 딸 수 있다.

printf("Password OK\n");

system("/bin/cat flag\n");

}

else{

printf("Wrong Password\n");

}


close(fd);

return 0;

}


문제에서 단순하게 생각하라고 한다. 결국 첫번째 10글자 인풋은 pwbuf1에 두번째 10글자 인풋은 pwbuf2에 저장된다. xor연산이있으므로 첫번째 10글자에 1을 xor한 값을 두번째 인풋으로 넣어주면된다.






'war game > pwnable.kr' 카테고리의 다른 글

pwnable.kr cmd1 1pt  (0) 2016.10.11
pwnable.kr lotto 2pt  (0) 2016.10.11
pwnable.kr blackjack 1pt  (0) 2016.10.11
pwnable.kr coin1 6pt  (0) 2016.10.11
pwnable.kr shellshock 1pt  (0) 2016.10.11

+ Recent posts