date : `17.02
Prudentialv2
50
We fixed our challenge from two years ago.
http://54.202.82.13/
조뚱띠가 푼 문제. 문제를 풀 때, 지문은 보지 않고 바로 문제로 가서 2년 전 문제는 보지 않고 바로 소스코드를 보았다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?php
require 'flag.php';
if (isset($_GET['name']) and isset($_GET['password'])) {
$name = (string)$_GET['name'];
$password = (string)$_GET['password'];
if ($name == $password) {
print 'Your password can not be your name.';
} else if (sha1($name) === sha1($password)) {
die('Flag: '.$flag);
} else {
print '<p class="alert">Invalid password.</p>';
}
}
?>
|
cs |
간단하다. get파라미터로 받는 name, password의 string형변환 값이 같지 않으면서 그 데이터의 sha1값은 같아야 하는 문제.
몇일 전 google에서 발표한 sha1 취약 발표가 있었기 때문에 sha1 충돌 문제라고 생각 하였으나, google에서 예시를 든 데이터는 pdf 파일이었기 때문에 get 파라미터로 보내기에는 너무 크다는 생각을 하였지만, 연구 내용을 잘 보면 sha1의 취약점 상 시작 header부분 조작을 통해 데이터는 다르지만 sha1의 값은 같도록 할 수 있다는 결과가 있었다.
SHA-1의 충돌쌍을 찾기위한 여정
2013년, Marc Stevenes 는 SHA-1의 충돌쌍을 찾는 이론적인(theoretical) 접근을 시도하여 이를 논문으로 발표하였습니다. 이에 착안하여, 먼저 특별히 설계된 PDF 헤더(prefix)를 제작하였습니다. 이 헤더를 통해 두 파일의 내용이 확연히 구분될 수 있도록 ...
기본 이론은 Marc Stevenes의 이론을 기반으로 한다고 하며 시작되는 pdf의 prefix가 동일하다는 전제가 있다고 한다.
예시로 shatter-1.pdf와 shatter-2.pdf를 주는데 두 pdf의 hex값을 비교해 보면 다음과 같다.
0x00C0 ~ 0x013F 영역을 제외한 모든 데이터는 동일하다. 두 pdf의 경우 배경 색상만 다르고 다른 내용은 똑같다. 결론적으로 위에서 차이나는 부분이 google에서 찾아낸 충돌 header의 경계이다.
python으로 해쉬값 비교를 해보면 같은 값을 얻을 수 있는 것을 알 수 있다.
두 sha1 해쉬값이 같기 때문에 문제의 조건을 통과할 수 있다.
대회 서버는 대회가 끝나고 바로 닫혔기 때문에 로컬에서 직접 만든 서버에 대해서 테스트를 해 보았다.
flag : FLAG{AfterThursdayWeHadToReduceThePointValue}
'CTF | wargame' 카테고리의 다른 글
abctf16 / yummi (baconian 암호) (0) | 2017.03.09 |
---|---|
xiomara 2017 / (not) guilty boyfriend (이미지 분석, png 이미지 카빙 - Stegsolve) (0) | 2017.03.09 |
3DS CTF - Santa Walks into a bar (qr코드 파싱) (0) | 2017.03.07 |
3DS CTF - Warmup (간단한 reversing) (0) | 2017.03.07 |
3DS CTF - Results does not matter (연산회로) (0) | 2017.03.07 |