11번째로 푼 문제이다.

제목은 타입 혼란??
type confusion



(type confusion)



문제 페이지는 아래와 같다.



(문제 페이지)




체크박스 하나있고 소스코드를 볼 수 있는 링크가 있다.

소스코드를 살펴보겠다.




(소스코드 분석)



소스코드를 정리하자면
POST방식으로 json 변수에 값을 넣어 전달해야하고
그 값의 key값이 페이지 내 생성된 key값과 같으면 flag가 나온다.

여기서 key값은 임의로 생성되므로 알아낼 길이 없다.
다만 비교연산자를 == 로 쓰는것을 보아 이 취약점을 이용하면 풀릴거라는 생각이 들었다.

전에 비교연산자로 인해 며칠을 고민했던 터라 이번 문제는 쉽게 풀 수 있었다.

바로 ==로 비교할때 문자는 0으로 변환되기 때문에 숫자 0과 비교하면 참이 나온다.


(비교 참)



그렇다면 나는 key에 0을 넣어 json 인코딩해서 넣어주면 된다!



(json 인코딩)



그런데 POST라면서 보낼 폼이 없다... 저기 체크박스도 name이 다르게 설정되어 안된다..

그래서 내가 만들어서 보냈다.




(son 값 보내기 폼)



만든 폼을
관리자모드에서 적어주어 폼을 보내준다.



(폼 작성)





(보내기)



보내면 flag가 나오고 문제가 풀린다! :)



(문제 해결)


'WarGame > 500 Project' 카테고리의 다른 글

(13/500) Wargame.kr - SimpleBoard  (0) 2017.04.16
(12/500) Wargame.kr - tmitter  (0) 2017.04.15
(10/500) Wargame.kr - md5 password  (0) 2017.04.14
(9/500) Wargame.kr - md5_compare  (0) 2017.04.13
(8/500) Wargame.kr - fly me to the moon  (0) 2017.04.13


9번째 푼 문제이다.

이 문제는 MD5 해쉬 충돌문제인 줄 알았지만 비교연산자의 취약점을 말하고 있던 문제였다.

md5_compare 문제이다!


(md5_compare 문제)



아래는 문제 페이지다.



(문제 페이지)



문제 페이지를 보면 입력값 2개가 보이고 chk 버튼이 보인다.

그러면 소스코드를 확인해보겠다.



(소스코드)



소스코드를 내가 나름 주석으로 분석했다.

결론적으로 v1입력에는 알파벳만
v2입력에는 숫자만 입력하여 md5가 같아야 된다는 것이다.

여기서 완전히 같은 값을 찾기는 힘드므로 == 비교연산자의 취약점을 이용해보도록 하자

== 비교연산자는 타입을 보지 않는다.
그리고 문자열에 숫자가 있다면 == 비교할 때 숫자로 인식하여 비교한다.

나는 e -> 지수표현을 이용할 것이다. 0e어쩌구~ 이렇게 나오면 0으로 인식한다는 것이다.
그러니! 숫자만 넣었을때 앞 두자리가 0e 영어만 넣었을때 앞 두자리가 0e면 된다는 것이다.

(숫자 입력)




숫자 해쉬 시 앞에 0e로 시작하니 이 값은 == 비교할 때 0이 될것이다. 또

(알파벳)




알파벳입력시
앞에 0e 이므로 == 연산시 0으로 취급될 것이다.

즉 두 값은 같다고 결과가 나올 것이고! flag를 ??

해보자!




(입력)



(결과)



문제 해결!


'WarGame > 500 Project' 카테고리의 다른 글

(11/500) Wargame.kr - type confusion  (0) 2017.04.15
(10/500) Wargame.kr - md5 password  (0) 2017.04.14
(8/500) Wargame.kr - fly me to the moon  (0) 2017.04.13
(7/500) Wargame.kr - WTF_CODE  (0) 2017.04.12
(6/500) Wargame.kr - flee button  (0) 2017.04.11

* 비교연산자
-> 비교를 하는 연산자이다. 종류로는
==       :  같다
!=        : 같지 않다.
왼쪽이 크다는 기준으로
>        : 크다.
<        : 작다
>=      : 크거나같다.
<=      : 작거나 같다

- 문자열도 비교연산자를 쓸 수 있다.  크기 비교도 한다 
: 크기 비교할 때 의미는 크지 않는데 문자마다 숫자값을 가지고 있어서 크기비교연산이 되기는한다.
   하지만 이걸 사용해서 문자 정렬을 하기도 한다.

* 수학식에서는 =  기호가 같다라는 뜻이다.
하지만 프로그래밍 언어에서 = 기호는 assignment 의미로 사용된다.

ex)
10 == 10
결과 -> True 
여기서 True는  문자열이 아니다. , 숫자 1과 같은 의미를 가지고있다. (반대로 False는 0을 의미한다.)
문자열에서는 '', "" 로 표현된다.

* bool's 논리식
 - AND(그리고) , OR(또는), NOT(아닌)

NOT 은 피연산자 하나만 온다.  (AND, OR 는 피연산자가 두개 와야한다.)

ex)
 A가 참이고 B가 참이면 결과는 참이다.
 A and B -> True   (A,B 에 보통 비교 연산자가 온다.) 

 A가 참이거나 B가 참이면 결과도 참이다. 
A or B  -> True   (A,B 둘 중 하나만 참이여도 결과는 참이다.)
 
A는 아니다.
 -> not A 
(만약 True면)  -> False


(비교연산자, bool's 연산자 예시)



* 표준 입/출력 함수
 
 - print() -> 표준 출력장치로 내용을 출력하는 함수

 - input() -> 표준 입력장치로 내용을 입력하는 함수
  - 한줄을 입력받는다.
  - 괄호 안에 문자열을 적으면 입력받기 전에 문자열을 출력해준다.
  - input된 값은 무조건 문자열이 된다. 
     (만약 숫자로 받고싶으면  정수형, 혹은 실수형으로 형변환을 해야한다.

분기문 -> 분기점을 만들어줄 수 있는 문장. (실행 흐름 제어)

* 파이썬에서의 분기문
 if 사용법
 
 if expression :   
 
 콜론을 써줘야한다. 
 if expression :
  <if block>
  ...
  ...
 -> if block의 구분 방법 : 들여쓰기로 구분한다.

if - else 사용법
 if expression:
  <if block>
 else:
  <else block>
 -> 둘중에 하나만 실행된다. else는 if문장이 참이 아니면 else blck을 실행한다.
 
다중 if 사용법
 다중 블록
 if expression:
  <if block>
 elif expression:
  <elif block>
 else:
  <else block>

* 반복문
 
 while expression :
  <while block>
 -> 조건이 참일 때 반복된다.

* 멤버 메서드
 
 해당 객체가 제공해주는 함수.
 문자열도 하나의 객체처럼 다뤄진다.

 -> isalnum()
 -> isdigit()  : 문자열에 숫자만 있는지 확인해주는 함수.

* 반복문 혹은  if문으로 block을 묶을 때 들여쓰기 간격이 일정해야한다.

* 프로그램 이란?
 - 저장된 명령어들을 일괄적으로 실행하는 것이다.

이제 지금까지 배운 내용들로 프로그램을 작성해 볼 것이다.

만들어볼 프로그램은
온도변환 프로그램이다.

특징
- 대화식 프로그램이다. 사용자가 입력하면 그에 따라 컴퓨터는 출력한다.
- 사용자가 섭씨 온도를 입력하면 화씨 온도로 변경해서 출력해주는 프로그램
- 혹은 화씨 온도를 입력하면 섭씨 온도로 출력하는 프로그램

* 알고리즘
: 문제를 해결하는 과정으로 프로그램의 동작 과정을 먼저 생각해야한다.


(프로그램 코드)


(정상적으로 출력되는 화면)


+ Recent posts