Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

okasokasokasokas

Codegate 2018 Final - G0Crack(Rev) 본문

Hacking/Write-up

Codegate 2018 Final - G0Crack(Rev)

Rogun Roger 2018. 4. 9. 15:24

바이너리 하나가 주어졌다.


G0Crack.zip


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
Comments