목록Wargame/pwnable.kr (21)
cgy12306
[lotto] #include #include #include #include unsigned char submit[6]; void play(){ int i; printf("Submit your 6 lotto bytes : "); fflush(stdout); int r; r = read(0, submit, 6); printf("Lotto Start!\n"); //sleep(1); // generate lotto numbers int fd = open("/dev/urandom", O_RDONLY); if(fd==-1){ printf("error. tell admin\n"); exit(-1); } unsigned char lotto[6]; if(read(fd, lotto, 6) != 6){ printf("e..
[blackjack] http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html 해당 주소로가면 blackjack에 대한 코드가 있다. 블랙잭은 확률게임이기 때문에 18 이상이 되면 stay를 하고, 딜러가 버스트 되는 것을 기다리는 코드를 짰다. remote('pwnable.kr', 9009) #context.log_level = 'debug' r.recv() r.sendline('Y') r.recv() r.sendline('1') while True: print r.recvuntil('Cash: $') cash = int(r.recvline()) r.recvuntil('Your Total is ') mycard =..
[coin1] nc로 pwnable.kr 9007에 접속해보면 다음과 같이 뜬다. 60초안에 100개의 가짜 코인을 찾으면 상을 준다고 한다. N개의 코인이 주어지는데 C번의 횟수안에 가짜 코인을 찾아야 한다. 코인 한개당 무게가 10이 나가는데 가짜 코인은 9가 나온다. index번째 코인을 여러개 입력하면 무게의 총합을 알려준다. 술게임 Up & Down 하는기분.. 입력할 수 있는 횟수의 제한도 있고, 하나씩 입력하게 되면 시간상의 문제가 발생한다. 그래서 절반씩 나눠서 입력하기로 했다.(나중에 알고보니 이진탐색 기법이라고 한다.) from pwn import * import time r = remote('pwnable.kr', 9007) sleep(3.1) r.recvuntil('- Ready? ..
[input] 소스 코드를 보면 다음과 같다. #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the flag :)\n"); // argv if(argc != 100) return 0; if(strcmp(argv['A'],"\x00")) return 0; if(strcmp(argv['B'],"\x20\x0a\x0d"))..
[random] 소스코드를 살펴보자. rand() 함수로 임의의 난수 값을 뽑아내서 key 와 xor연산한 후 0xdeadbeef와 같으면 /bin/cat flag 명령어를 실행하는 소스코드이다. rand() 함수는 실행할 때 마다 같은 값을 뽑아내는 취약점이 있다. 우선 rand() 함수값을 출력하는 코드를 로컬에서 만들어서 실행해보자. #include int main(){ int ran; ran = rand(); printf("%d", ran); return 0; } 실행할 때 마다 1804289383이라는 같은 값을 반복해서 뽑아내는 것을 알 수 있다. 그럼 rand 값은 1804289383이다. 여기서 key와 rand 값을 xor 연산해야하는데 xor 연산 특성상 a ^ b = c 라는 식이 있..
[passcode]welcome() 함수를 호출하고, login() 함수를 호출한다.welcome() 함수에서는 name 변수를 100byte만큼 할당해주고, 입력을 받는다.login() 함수에서는 passcode1 변수에 값을 입력하고, fflush() 함수로 스트림의 버퍼를 비워준다.이후 다시 passcode2 변수에 값을 입력하고, passcode1은 338150을 passcode2는 13371337과 비교해서 같으면 /bin/cat flag 명령어를 실행한다.하지만 저 위에서 scanf의 사용법이 잘못 되었다.원래라면 scanf("%d", &passcode1); 로 작성 되어야 하지만 &가 빠져있다.이 말은 passcode1의 주소에 값을 넣는게 아닌 passcode1이 가지고 있는 값을 주소로 ..
[shellshock]소스코드를 보자.bash로 echo shock_me 명령어를 실행한다.shellshock는 bash shell에 존재하는 보안 취약점이다. 함수 끝에 임의의 명령어를 추가로 삽입할 경우, Bash가 함수에서 처리를 멈추지 않고 추가로 삽입한 명령어를 계속 실행 시키기 때문에 이런 취약점이 발생한다.환경변수에서 값을 넣을 뿐만 아니라 함수도 넣을 수 있다.() {로 시작하는 문자열을 시스템 환경변수에 저장하면 동일한 이름을 가진 함수로 선언이 된다. bash를 실행하면 등록된 환경변수를 읽어오는데 여기서 함수가 등록되어 있으면 함수를 실행한다.: 는 true라는 값을 가진다. 함수 내부를 참으로 만들고 뒤에 /bin/cat flag 명령어를 삽입해서 shellshock 바이너리를 실행..