Wargame
-
[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]에 저장되고,..
-
[LOS] 19. xavis 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 24. 00:15
pw에 괄호, LIKE, regex가 필터링이 걸려있다. 또한 id는 admin으로 고정되어 있고, 이 admin에 대한 pw를 알아내면 문제가 해결된다. 먼저 pw의 길이를 length 함수를 통해 찾아본 결과, pw의 길이는 12였다. ?pw=' or length(pw)=12%23 평소 Blind SQL 인젝션 문제를 풀던 것처럼 ascii 함수와 substr 함수를 사용하여 pw를 구하려고 했으나, 아무리 프로그램을 돌려도 pw가 출력되지 않았다. 알파벳이나 숫자가 아닌 다른 문자인가 싶어서 0~9, a~z 범위 외의 다른 범위의 아스키코드 값으로도 찾아보았지만 나오지 않았다. 아무래도 알파벳, 숫자가 아닌 특수 문자가 사용된 것 같아서 pw를 hex로 변환한 값으로 비교해보았다. 먼저 hex로 변..
-
[LOS] 18. nightmare 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 22. 18:06
주석 처리에 사용되는 --와 #이 모두 필터링 목록에 포함되어 있다. 괄호 역시 필터링 대상인데, 특이한 것은 ()만 필터링되고 (나 )를 따로 사용하는 것은 필터링이 되지 않는다는 점이다. 또한 pw의 길이가 6보다 크면 No Hack 문구가 출력된다. 길이 제한이 있기 때문에 or 1=1과 같은 인증 우회는 사용이 불가능하다. 따라서 길이 제한을 피하고 쿼리문이 참이 되게 하려면 pw가 참이 되도록 만드는 수밖에 없다. SQL에서 문자열을 숫자와 비교할 때, 숫자 없이 문자로만 이루어진 문자열은 0으로 자동 형변환된다. 또한 select id from table where pw=1=1와 같이 쿼리문을 작성하면, 1=1은 참이므로 전체 쿼리문은 참이 되어 정상적으로 실행된다. 이러한 점들을 이용하여, ..
-
[LOS] 17. zombie_assassin 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 22. 17:41
id와 pw에 addslashes 함수와 strrev 함수가 사용되었다. addslashes 함수는 싱글 쿼터('), 더블 쿼터("), 백슬래시(\), NULL 문자를 이스케이핑해주는 함수이고, strrev 함수는 인자로 받은 문자열을 순서를 뒤집은 상태로 반환하는 함수이다. ex) strrev("abcdefg"): gfedcba strrev 함수로 인해 GET 방식으로 전달된 id와 pw는 아래와 같이 변환된다. id=admin&pw=12 또한 addslashes 함수로 인해 싱글쿼터(')나 더블쿼터(')는 이스케이핑되어 앞에 백슬래시(\)가 추가되고, strrev 함수에 의해 순서가 뒤집힌다. 따라서 싱글쿼터(')를 인자로 주면 addslashes에 의해 \'가 되고, strrev 함수에 의해 '\가..
-
[LOS] 16. succubus 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 22. 15:08
id와 pw를 입력받을 때, 둘 다 싱글 쿼터(')를 필터링한다. 이전에 싱글 쿼터(')는 더블 쿼터(")로 우회할 수 있다고 했는데, 사실 이 방법은 쌍으로 사용할 때나 먹히는 방법이다. 즉, 싱글 쿼터(')가 하나 열려있는 상태에서는 더블쿼터(")로 막을 수 없다. ('admin" 이렇게 사용할 수 없다는 뜻) 이 문제에서는 id와 pw를 동시에 입력받으므로, 이를 이용해 싱글 쿼터(')를 우회해보자. 싱글 쿼터(') 앞에 백슬래시(\)를 입력하면 싱글 쿼터(')는 문자로 인식된다. 따라서, id='' and pw='' 에서 \를 입력하면, id의 닫는 싱글 쿼터(')가 문자로 인식되어 해당 싱글 쿼터(')가 제 기능을 하지 못하게 된다. 결국 pw의 여는 싱글 쿼터(')가 id의 닫는 싱글 쿼터('..
-
[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 함수를 통해 사용자 이름을 입력받..
-
[LOS] 15. assassin 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 19. 03:11
이번 문제는 필터링되는 문자가 싱글 쿼터(')밖에 없다. 이 싱글 쿼터(')를 우회해서 id가 admin이 되도록 조작할까 싶었지만, 아쉽게도 이 문제에서는 싱글 쿼터(')를 우회할 수 있는 방법이 없었다. 그런데 쿼리문에서 pw를 비교할 때 등호가 아닌 LIKE가 사용된 것이 걸린다. LIKE는 pw의 일부만 같아도 true를 반환하기 때문에, admin의 pw를 한 글자만 알아내도 LIKE에 의해 전체 쿼리문이 참이 되어 admin을 select할 수 있게 된다. LIKE 구문에서 사용하는 특수 문자 중에는 %가 있다. %는 0개 이상의 문자를 의미한다. 따라서 만약 pw LIKE "a%" 라는 쿼리문을 실행했을 때, pw의 맨 첫 번째 문자가 a면 true, 아니면 false를 반환한다. %를 이용..