-
[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
-
[LOS] 23. hell_fire 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 8. 1. 19:57
이번에는 쿼리문 상단에 id, email, score 3개의 컬럼으로 이루어진 테이블이 존재한다. 또한 제시된 쿼리문은 order by 구문을 통해 순서대로 정렬된 테이블을 반환한다. 만약 id가 admin이면 email은 *로 표시되는데, 이 email을 알아내는 것이 이 문제의 최종 목표이다. 일단은 테이블에 뭐가 있는지 확인하려고 order에 1을 넣어봤다. 그랬더니 아래처럼 2개의 row가 출력되었는데, admin의 email만 *로 표시된 채로 나타나지 않았다. order by 절을 어떻게 조작할지 고민했는데, 처음에는 order by 절에도 서브 쿼리를 넣을 수 있고, 2개 이상의 row를 반환하면 에러가 발생한다는 것을 알고 이를 이용해 에러 기반 Blind SQL 인젝션으로 문제를 풀려고 ..
-
[LOS] 22. dark_eyes 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 31. 21:34
iron_golem 문제와 같은 에러 기반 Blind SQL 인젝션이다. 그러나 iron_golem과 달리, if문과 case, when 구문이 필터링 목록에 포함되어 있고, 에러가 발생하면 아무런 에러 문구도 출력하지 않는다. iron_golem에서는 if문을 사용하여 pw를 알아냈지만, dark_eyes에서는 이 방법을 사용할 수 없기 때문에, 이를 우회할 수 있는 coalesce 함수를 사용하였다. coalesce 함수의 형식은 다음과 같다. coalesce((리턴값), 변환값) 만약 리턴값이 NULL이면 변환값을 반환해준다. 예를 들어서 아래와 같은 쿼리문이 있다고 가정하자. SELECT id FROM table WHERE 2=coalesce((select id from table where 1=..
-
[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..
-
[LOS] 21. iron_golem 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 30. 03:05
또 Blind SQL 인젝션 문제다... 이번 문제에서는 이전 문제에서처럼 쿼리문이 맞았을 때 Hello admin과 같은 문구가 뜨지 않는다. 즉, 쿼리문의 참/거짓 여부를 알 수가 없다. 이런 경우 웹 요청에 대한 응답 시간의 차이를 이용하여 pw를 찾아야 하는데... 문제는 이러한 방법에 사용되는 sleep과 benchmark 함수가 필터링 목록에 있기 때문에 이것도 사용할 수가 없다. 그런데 코드를 자세히 보면 쿼리문에 에러가 발생할 경우 에러를 출력해주고 exit한다는 것을 알 수 있다. 즉 이 문제에서는 에러의 발생 여부만 알 수 있다. 따라서 에러가 발생하지 않으면 참이고, 발생하면 거짓이라고 판별할 수 있도록 쿼리문을 짜면 pw에 대한 정보를 알아낼 수 있을 것이다. 이를 위해서는 쿼리문에..
-
[LOS] 20. dragon 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 29. 19:39
id='guest' 다음에 #이 있어서, and pw='~ 부분이 주석으로 처리되었다. 이 주석 처리를 피해서 id를 admin으로 바꾸면 문제가 풀릴 것이다. #은 한 줄만 주석 처리되기 때문에, 쿼리문이 멀티 라인으로 이루어진 경우에 첫 줄에 #이 있으면 그 첫 줄만 주석 처리되고 나머지 두 줄은 주석으로 처리되지 않는다. 따라서, pw 인자 부분에 개행 문자(\n, %0a)를 넣어준 다음에 원하는 쿼리문을 작성한다면, select id from prob_dragon where id='guest'# and pw='%0a or id='admin' # and pw=' 부분까지만 주석으로 처리되고 이 뒤의 문자열들은 모두 쿼리문으로 인식될 것이다. 그래서 위와 같이 쿼리문을 작성하여 pw의 인자를 넘겨주었..
-
[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..