목록전체 글 (166)
Pwnstar

13번째 로또 접속 이것도 전 문제같은 게임 형식의 문제일 것 같아 바로 실행해봤다. 이렇게 1번 로또 실행, 2번 도움말, 3번 종료가 있다 1번을 누르면, 6개의 수를 입력하라는 문구가 있다. 뭐...이것도 랜덤 값 맞추는 그런 문제일 것 같다. 이렇게 숫자가 틀리면 bad luck...이라는 문구가 뜬다. 이제 소스코드를 확인해보자. #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); /..

12번째 문제 blackjack이다. 이것도 한번 실행해보자. 이렇게 시작하면 1번으로 게임을 시작할 수 있고, 2번으로 규칙 확인, 3번으로 게임을 종료할 수 있다. 그 전에 http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html 이 사이트로 가면 이 게임의 소스코드가 나와있는데, 봐도 뭐 어느 부분에서 플래그가 뜨는지, 쉘이 따지는 지가 나와있지 않다. 우선은 뭐 돈을 많이 따면 되겠지 하면서 게임을 하기 시작했는데 너무 아무 생각없이 오래 하다가 정신을 차렸다. 그래서 일단 더 게임을 하며 생각을 해 보다가...돈을 -10000000 이런 식으로 배팅하면 어떻게 될까 싶어서 해봤다. 이런 식으로 -100000..

11번째 문제 coin1이다. 이번엔 nc로 접속하는 문제인가보다. 실행하면 이렇게 시작된다. 대충 해석해보면 N개의 코인과 C번의 기회가 주어지고, 이 C번의 기회 동안에 N개의 동전 중 불량 동전을 골라내야 한다. 정상 동전은 무게가 10, 불량 동전은 무게가 9이다. 동전의 번호를 입력으로 줄 수 있는데 입력으로 준 동전들의 무게 합이 출력된다. 그리고 100번을 맞춰야하는데 60초 안에 해결해야 한다. 즉, 그냥 풀기는 불가능하고 코딩해서 풀어야한다. 어려운 문제는 아니지만 포너블 문제라기보다 백준 사이트에 나올법한 코딩 문제였다. 이진 탐색으로 풀 수 있는... 뭐 다른 설명은 필요 없을 것 같고 익스 코드만 올려놓고 마치겠다. from pwn import* import re p = remote..

10번째 문제 shellshock이다. 사실 이 문제를 처음 풀 때에는 도저히 이해가 가지 않아서 결국 라이트업을 보고 풀었다. 이번에도 완벽히 이해하고 풀었다고는 못하겠다. 어찌어찌 풀긴 했지만.. 우선 접속해서 소스코드를 보자. 소스코드는 참 짧다. 실행하면 이렇게 shock_me가 뜬다 shellshock 취약점에 대해서 여러 블로그들을 찾아보며 대충 익힌 것들을 설명하자면 이 부분에서 사실 처음 환경변수를 등록하는 부분인 env x='() { :;}; 이 부분 이후의 명령어는 무시되어야 맞다고 한다. 그리고 지금 실제로 무시되고는 있는데.. 이렇게 bash를 절대경로로 주면 무시되어야하는 부분들이 정상적으로 출력된다. 이 취약점을 대충 응용해보면 될 것 같아서 소스코드에 echo를 이름으로 환경변..

9번째 문제 mistake이다. 리얼 이벤트에 기반을 둔 문제라고 한다... 힌트는 연산자 우선순위 우선 접속해보자. 소스코드는 다음과 같다. #include #include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i 0)){ printf("read error\n"); close(fd); return 0; } char pw_buf2[PW_LEN+1]; printf("input password : "); scanf("%10s", pw_buf2); // xor your input xor(pw_buf2, 10); if(!strncmp(pw_buf, pw_buf2, PW_LEN)){ printf("Passwor..

7번째 input이라는 문제다. 사실 이 문제...는 그리 재밌게 푼 기억도 아니고 그래서 별로 라업을 쓰고 싶지는 않다. 유익한 문제는 아니라고 생각된다. 그래도 라업은 써야 하니까!!! 우선 접속해보자. 64비트 바이너리이고, canary와 nx가 걸려있다. 우선 소스코드를 먼저 보자. #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 yo..

6번째 문제 random이다. 일단 접속을 해보자. 우선 64비트 파일이고, NX만 걸려있다. 음 코드를 보니 rand()함수로 임의의 값을 random 변수에 넣고, 입력받은 key 값을 xor 연산하여 0xdeadbeef와 같으면 flag를 볼 수 있을 것 같다. random 변수가 랜덤으로 정해지는 거면 이 값을 어떻게 파악을 해야하나..고민을 하다가 rand함수에 대해 찾아보았다. rand()함수는 매번 다른 값을 생성하지 못하고, srand함수와 함께 사용해야 seed값이 매번 달라져 다른 값을 생성한다는 것이다. 즉, 이 문제에서는 srand함수를 사용하지 않으므로 rand 함수는 항상 같은 값을 가지고 있다. gdb로 확인을 해 보았다. rand함수를 호출하는 부분에 break point를 ..

5번째 문제 passcode이다 저기로 접속을 하면 이렇게 파일이 세 개 나온다. 우선 코드를 살펴보자. #include #include 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!\..