WarGame/Pwnable.kr

collision

Cand0 2019. 1. 4. 11:22

 collision.hwp


사전 분석

 


해당 디렉토리에 있는 파일입니다.

col을 실행하여 flag값을 얻어야 하는듯합니다.

 

col의 소스코드


 

소스 분석


main 함수

 

해당파일은 입력 값을 받아, 그 글자의 크기가 20글자이어야 하며, 입력한 값과 hashcode의 값이 같아야 flag파일을 볼 수 있는 듯합니다.

 

여기서 hashcode의 값은 0x21DD09EC입니다.

 

./col test

로 입력한 경우에는

argv[0] = col

argv[1] = test

가 들어가게 됩니다.


check_password함수

 

여기서 이상한 점은 입력받을 때는 char 형으로 받지만 check_password 함수에 들어갈 때는 int 형으로 데이터를 더해준다는 것입니다.

./col 12341234123412341234를 입력하게 된다면 res에 들어가는 값은

1234 + 1234 + 1234 + 1234가 더해지게 됩니다.

 

다시 말하면

char = 1byte

int = 4byte

이며 이를 이용하여 포인터로 더해주는 것입니다.

 

hashcode == argv[1]이어야 하기 때문에,

0x21DD09EC == argv[1]

argv[1]20글자이며 이를 5로 나누어주게 되면

 

0x21DD09EC == □□□□ + □□□□ + □□□□ + □□□□ + □□□□

다음과 같이 들어간다고 생각하면 됩니다.

 

그러면 21DD09EC5로 나누어주면 6C5CEC8이고 나머지가 4가 됩니다.

 

그래서 입력값을 6C5CEC8 + 6C5CEC8 + 6C5CEC8 + 6C5CEC8 + 6C5CECC를 입력하게 되면 됩니다.(6C5CECC는 나머지 4가 포함된 값.)

 

하지만!! 현재 7byte * 5 가 들어가 있기 때문에 20글자가 넘어가게 됩니다.



첫 실패...


그래서 가장 먼저 생각한 방법이 ascii코드를 이용하는 것 이였습니다.

가장먼저 4개의 입력값을 넣어 6C5CEC8를 만들기 위해서는

6C5CEC8을 다시 표현해서

06 C5 CE C8 로 생각하여 06에 맞는 문자값 C5에 맞는 문자값 CE에 맞는 문자값 C8에 맞는 문자값으로 넣어주면 어떨까 라는 생각을 했습니다.

 

여기서 중요한점은 ascii코드는 128비트 즉 한 바이트의 값만 다룬다는 점입니다. 그렇다는 것은 이를 아스키 코드로는 표현할 수 없다는 것입니다.

 

그렇다면 유니코드를 사용하면 어떨까? (유니코드는 2byte로 제작 되었다.) 라는 생각을 했지만 이 문제를 코딩하여 실행해본 결과 유니코드의 전체 문자열을 디버거가 인식하지 못했습니다...ㅠㅠㅠ

마찬가지로 이번 col문제의 시스템에서도 인식이 안되는 문자가 있었습니다.

    디버거 :: (C5)Å문자는 A문자로 인식하는 등의 문제가 있었음.

    COL :: (06)문자 자체가 복붙이 안됨.

(유니코드 변환 사이트 : http://mwultong.blogspot.com/2008/02/16-2-10-8-hex-calc.html)

이 문제를 풀면서 값을 어떻게 입력을 해야할지가 가장 오래 고민한 부분이였던 것 같습니다.

 

그렇게 한~~~~참을 고민해도 도저히 답은 나오지 않았습니다.... 지식의 한계...

결국에는 다른사람의 풀이를 살~~짝 보았더니 python c를 사용....

, 커멘드라인을 사용하여 때려 박는...? 방식을 사용하더라구요(허탈...)

 

 


결과 도출

 


앞서 말했던 것처럼

6C5CEC8 + 6C5CEC8 + 6C5CEC8 + 6C5CEC8 + 6C5CECC 를 입력하기 위해서는

python c ‘print “\x06\xC5\xCE\xC8”*4 + “x06\xC5\xCE\xCC”’를 입력하면 될 줄 알았더니 막상 해본 결과 되지 않는다...

이는 시스템에서 리틀 엔디안 방식을 사용하기 때문이고, 순서만 바꿔주면 해결 가능하다.

python c ‘print “\xC8\xCE\xC5\x06”*4 + “\xCC\xCE\xC5\x06”’

 

입력 값 : ./col `python -c 'print "\xC8\xCE\xC5\x06"*4+"\xCC\xCE\xC5\x06"'`

 

!!!!추가적으로 python c 옵션에 대해서 좀 더 알아봐야 겠다!!!!