okasokasokasokas
Codegate 2018 Final - G0Crack(Rev) 본문
바이너리 하나가 주어졌다.
64bit 리눅스 바이너리이고
실행을 해보면 Secret code를 요구한다. 여기까지만 요구하면 좋겠다.
아이다를 써서 보자.
main_main 이런게 있으면 golang 이넹
딱 Function 이름들 만 봐도 golang 로 만들어졌다는 것은 바로 알수있다.
친절한 출제자님의 자비에 의해 strip 도 안되어있으니 분석해야 할 부분은 checkInput 과 checkValid 만 보면 되겠다.
하지만 우리의 분석속도를 5조 5억배만큼 줄여주는 F5 키가 먹히질 않는다!
아니왜요;;
변수의 사이즈가 이상해서 변수들의 공간이 막 겹쳐서 에러가 나는듯 싶다. 하지만 이것은 쉽게 컴파일러 세팅을 바꿔서 분석을 시켜주면 된다.
Option - Compiler 에 들어가면 어떤 컴파일러로 컴파일을 했는지 가정할수 있고 Calling convention, 포인터 size, 변수 size 등을 정해줄수 있다.
에? int 가 8byte 랍니다!
sizeof(int) 의 8을 4로 바꾸자. 그러니까 F5가 잘된다.
golang 은 뭐 bound 체크라든가 그런게 코스 사이에 알아서 들어가는데 최대한 그런것들을 없에고 그냥 필요하지 않은 부분들도 있어서 그것을 정리한 코드이다. 잘못 정리했을수도 있으므로 바이너리 직접 열어서 보는걸 추천한다.
요약하면 평문의 i 번쨰 글자의 값에 2배를 한다음 main_key 랑 xor을 하고 나중에 main_check 와 비교를 하는 로직이 있고 맨 마지막 글자에 특별한 연산을 해서 checksum 비슷하게 체크를 하는 부분이 있다. 그리고 이것을 모두 통과해야한다.
일단 맨 마지막 글자 빼고 나머지는 이런 식을 사용해 복구를 할수가 있다. ((main_key ⊕ main_check) / 2)
checksum 의 경우 input 에 key 로 xor 한것을 모아서 다 더한후 15까지 더해서, v4 - 127 * ((((4647998506761461825LL * v4) >> 64) >> 5) - (v4 >> 63)) - 23 ) 라는 식에 v4에 들어가서 계산후에 마지막 글자랑 비교를 한다.
굳이 중간에 계산하는거 보여주기는 그러니 그냥 풀이 코드를 확인해보면
c4tch_y0ur_dr24m@@!
'Hacking > Write-up' 카테고리의 다른 글
Midnight Sun CTF 2020 Qual - pysonIVY (0) | 2020.04.06 |
---|---|
SECCON CTF 2017 - z80 - 300 points (0) | 2017.12.10 |