목록Pwnable.kr/Toddler's Bottle (18)
Pwnstar

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!\..

4번 flag라는 문제이다. 이렇게 바이너리 하나를 다운받을 수 있게 주는데, 리버싱 문제라네?? 이런 식으로 실행시켜보면 플래그를 malloc해서 strcpy로 넣어놓는다고 한다. 그거를 찾으면 되는건데.. IDA로 열어보니 이런 식으로 함수 네개만 주고 무슨 바이너리인지 도통 모르겠다...그래서 이 것만 뒤져보고 계속 고민을 해 보다가 upx~ 어쩌구 써있는 게 눈에 띄고, 리버싱 태스크라는 것도 기억이 나서 언패킹을 해봤다. 언패킹 성공 이 파일을 다시 IDA에 넣어 보았다. 이렇게 제대로 된 main 함수가 존재했다. flag라는 이름의 전역 변수가 있어서 혹시 이걸까?? 싶어서 봤는데 요게 플래그네... 끗!!

3번째 문제 bof이다. 이 문제는 다른 문제와 다르게 소스파일과 바이너리를 주고, nc로 연결해서 프로그램을 실행하게끔 되어있다. 우선 소스는 이렇게 되어있다. func함수에 0xdeadbeef를 인자로 주고, 32바이트 크기를 가진 overflowme를 overflow해서 key의 값을 0xcafebabe로 만들어주면 쉘이 따질 것 같다. 음 까나리가 걸려있는데 3번부터 까나리를 릭하는 문제가 나오려나..걱정하면서 func함수의 gets에 브레이크포인트를 걸고 실행해보았다. A 32개를 입력으로 줘 보았는데 저 밑에 0xdeadbeef가 보인다. dummy를 52개 주고, cafebabe를 입력으로 주면 될 것 같은데... 중간에 까나리가 있어서 찝찝하다. 일단 익스 코드를 짜 보았다. from pw..