Securing Keys

[Linux] pwnable.kr collision 풀이 본문

IT/Linux

[Linux] pwnable.kr collision 풀이

GRACE_MJ 2022. 4. 2. 20:47

이번엔 두번째 단계: collision을 풀어보도록 하겠다.

문제를 확인해보면 위와 같다. MD5 Hash collision 에 관한 문제임을 힌트로써 얻을 수 있었다.

 

Collision Attack

In cryptography, a collision attack on a cryptographic hash tries to find two inputs producing the same hash value, i.e. a hash collision. This is in contrast to a preimage attack where a specific target hash value is specified.

There are roughly two types of collision attacks:

Classical collision attackFind two different messages m1 and m2 such that hash(m1) = hash(m2).

More generally:

Chosen-prefix collision attackGiven two different prefixes p1 and p2, find two appendages m1 and m2 such that hash(p1  m1) = hash(p2  m2), where  denotes the concatenation operation.

 

Collision Attack에 대해 찾아보니 위와 같은 사실을 알 수 있었고, 결론적으로 충돌 공격이란 해시 충돌이 일어나는 (해시값이 동일한) 서로 다른 두 입력값을 찾는 공격이다.

 

쉘에 접속하여 확인해보니 col 실행파일과 코드가 담겨져 있는 col.c, 그리고 궁극적으로 읽어야 하는 flag 파일이 있었다.

col.c 파일을 읽어보니, col 실행 시 인자가 한 가지 필요했고, 이는 20 byte 이상이어야 한다.

입력된 인자는 check_password() 함수의 인자로써 다시 사용되는데, 해당 함수의 결과값이 0x21DD09EC와 동일하면 플래그값을 읽을 수 있을 것으로 보인다.

코드 상에서 다섯번에 나눠서 리턴값을 도출하는 것으로 보아, 합이 0x21DD09EC가 되게끔만 4byte 짜리 다섯등분을 하여 이를 입력값으로 넣어주면 될 것으로 보인다. 결과적으로 어떻게 다섯등분을 하는지는 상관이 없기 때문에 앞서 문제에서 MD5 Hash Collision 이라는 힌트를 준 것으로 보인다.

0x21DD09EC를 만들어줘야하기 때문에 우선 이를 5로 나누었다.

5로 나눈 값은 정수로 113626824였고, 그렇게 했을 때 남는 나머지는 4였다.

우선 5로 나눈 몫을 hex로 표현하면 0x6C5CEC8이니, 처음 16 byte는 0x06C5CEC8 로 네 번 채우면 될 듯 하고

마지막 4 byte는 앞서 나눈 나머지인 4를 더하여 hex로 표현한 0x06C5CECC로 채울 것이다.

 

이제 이걸 리틀 엔디언 방식으로 col 실행파일에 인자로써 넣어줄 것이다.

\xc8\xce\xc5\x06 4번과 \xcc\xce\xc5\x06 1번으로 인자로써 넣어준다.

그러면 결과적으로 플래그 값을 확인할 수 있다.

Comments