Wargame/pwnable.kr
-
[pwnable.kr][Toddler's Bottle] 10. shellshockWargame/pwnable.kr 2019. 8. 4. 05:14
먼저 해당 계정으로 들어가서 파일을 확인해보았다. flag, shellshock 파일 외에 bash가 존재했다. 일단 shellshock.c 부터 먼저 확인해보았다. setresuid는 프로세스의 Real UID, Effective UID, Saved Set-User-ID를 변경하는 함수로, 여기서는 getegid()로 설정된 것으로 보아 현재 호출된 프로세스의 UID로 설정된다. setresgid는 setresuid와 마찬가지 방법으로 gid를 설정한다. uid와 gid를 모두 설정한 후에 system 함수로 bash를 실행한다. flag와 shellshock의 권한이 같으므로, shellshock를 실행하는 도중에 flag를 실행하면 flag를 읽을 수 있을 것이다. shellshock는 2014년에..
-
[pwnable.kr][Toddler's Bottle] 9. mistakeWargame/pwnable.kr 2019. 8. 4. 03:41
ID: mistake, PW: guest로 로그인한 후 안에 있는 파일을 확인해보았더니 flag와 mistake 파일, password 파일이 있었다. mistake.c 파일을 확인해보았다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #include #include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i
-
[pwnable.kr] [Toddler's Bottle] 8. legWargame/pwnable.kr 2019. 7. 31. 18:30
문제에 나온 파일을 다운받아서 확인해보았다. leg.c를 먼저 확인해보자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc, $1\n" "bx r6\n" ".code 16\n" "mov r3, pc\n" "add r3, $0x4\n" "push {r3}\n" "pop {pc}\n" ".code 32\n" "pop {r6}\n" ); } int key3(){ asm("mov..
-
[pwnable.kr][Toddler's Bottle] 7. inputWargame/pwnable.kr 2019. 7. 26. 22:27
ID: input2, PW: guest로 접속한 후 파일을 확인해보니 input 파일이 있었다. input.c 파일을 확인해보았다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); prin..
-
[pwnable.kr][Toddler's Bottle] 6. randomWargame/pwnable.kr 2019. 7. 26. 16:51
ID: random, PW: guest로 접속한 후 파일을 확인해보니 random 파일과 flag 파일이 존재했다. random.c 파일로 소스코드를 확인해보았다. rand() 함수를 통해 생성된 난수를 random 변수에 저장하고, 사용자의 입력값을 key에 저장한다. 그리고 이 두 값을 XOR 연산한 값이 0xdeadbeef와 같으면 flag가 출력된다. rand() 함수는 난수를 생성해주는 함수이지만, 프로그램을 실행할 때마다 항상 같은 난수를 생성한다는 취약점이 있다. 따라서 rand() 함수가 생성한 난수값을 알아내면 문제가 해결될 것이다. random 값을 알아내기 위해 gdb를 실행하여 디스어셈블링해보았다. 위의 코드를 보면, rand 함수를 통해 생성된 난수는 [rbp-0x4]에 저장되고,..
-
[pwnable.kr][Toddler's Bottle] 5. passcodeWargame/pwnable.kr 2019. 7. 19. 22:35
문제에서 passcode 기반의 로그인 시스템을 만들었는데, 컴파일 시에 오류는 없었지만 경고가 있었다고 한다. 아마 이 경고 때문에 로그인 시스템에 취약점이 있는 듯하다. ID: passcode, pw: guest로 로그인한 다음 파일을 확인했더니 아래와 같이 3개의 파일이 있었다. passcode 파일을 실행해보았다. 실행하면 이름을 먼저 입력하고, passcode1을 입력할 수 있다. 그런데 passcode2는 입력하라는 문구가 있는데도 입력이 되지 않고 바로 checking으로 넘어갔다. 또한 passcode1에 숫자만 입력하면 Segmentation Fault가 일어났다. 원인을 알아보기 위해 passcode.c를 확인해보았다. main에서는 먼저 welcome 함수를 통해 사용자 이름을 입력받..
-
[pwnable.kr][Toddler's Bottle] 4. flagWargame/pwnable.kr 2019. 7. 18. 01:25
이번 문제는 리버싱 문제이다. wget로 문제에 나온 flag 파일을 다운받는다. 바이너리 파일이기 때문에 cat 명령어로는 파일을 열람할 수 없다. 그래서 바이너리 파일을 열람할 수 있게 해주는 xdd 명령어로 파일을 열람해보았다. xxd flag | less 이번엔 바이너리 파일에서 문자열만 추출해서 보여주는 strings 명령어로 flag 파일을 확인해보았다. 확인 결과 flag 파일이 UPX로 패킹되어 있다는 것을 알 수 있었다. flag 파일을 UPX로 언패킹 해보았다. 언패킹한 flag 파일을 실행해본 결과 아래와 같은 문구가 출력되었다. (처음에는 파일에 실행 권한이 없으므로 chmod로 실행 권한을 부여한다.) 출력된 문구에는 malloc( )을 하고 flag를 strcpy하겠다고 쓰여있다..
-
[pwnable.kr][Toddler's Bottle] 3. bofWargame/pwnable.kr 2019. 7. 17. 15:00
이번 문제는 버퍼 오버플로우에 관한 문제이다. 먼저 bof와 bof.c 파일을 wget 명령어로 다운받는다. 다운받은 bof.c 파일을 확인해보자. func 함수 내에 gets 함수가 사용된 것을 확인할 수 있다. gets 함수는 표준 입력(stdin)에서 문자열을 가져오는 함수로, 읽어들일 문자열의 길이를 지정하지 않기 때문에 버퍼 오버플로우가 발생할 수 있다. func 함수에서는 버퍼인 overflowme의 크기가 32 bytes이므로 이 크기를 넘어서는 문자열을 입력값으로 주면 key의 값도 조작할 수 있을 것이다. 인자 key를 조작하기 위해서는 먼저 key의 위치를 알 필요가 있다. 이를 위해 gdb를 실행시켜 func 함수를 디버깅해보았다. key와 0xcafebabe를 비교하는 부분이 fun..