본문 바로가기

CTF_Write_UP/etc

[Facebook CTF 2019] Facebook CTF 시작!! // 후기

오늘!! 6월 1일 9시부터 Facebook CTF 2019가 시작되었습니다 ..만

 

약 8시간동안 포너블 한 문제도 못 풀었어요!!! ㅋㅎㅎㅎㅎㅎㅎㅎㅎ

 

overfloat 푸는 과정을 로그처럼 남길까 합니다..

 

#context_log.level = "debug"

 

06/01

0908i : irc 품 +1 point

 

~1200i :

trace, strace로 overfloat 분석, fgets를 이용했기 때문에 overflow가 발생하지 않는 것에서 1차 충격

 

~1500i :

열심히 pdisas chart_course 삽질.. 옆에서 같이 풀던 친구가 음수값을 집어넣으면서 세그멘테이션 오류 띄움

 

~1600i :

무한삽질 끝에 [1] ~ [7] 중 하나라도 입력에 - 기호가 붙으면 main의 리턴이 터지는 것을 확인

 

~1700i :

굳이 음수가 아니더라도 LAT[7]에 값이 있으면 세그가 뜸

main의 리턴을 csu로 돌려서 풀려고 함. LAT[7]에 특정 값을 집어넣었더니 main의 리턴이 변조되는 것 확인

1시간동안 순도 100% 삽질로 LAT[7]에 0.00000000000000000000000000000000000000000005881224e5 구해서 넣으니 리턴에 400a76 (csu gadget) 가 들어감!!! 정말 긴 싸움이었음

뒤에 e5는 atoi 함수 사용법 찾다가 이렇게도 표현해요!! 란 설명 보고 생각없이 썼는데 어쩌다보니 구해짐 ㅎ..

0.000000... 때려박고 리턴값 보고 크면 다시 0 몇 개 더 넣고 얼추 비슷해지면 하나하나 다 때려봄.. 이렇게 푸는 게 아닌 것 같은데 쨋든 해봤음

 

삽질중

다 된 줄 알고 좋아했는데 변조되는건 chart_course의 ret이 아닌 main의 ret임.. 스택에 값을 집어넣을 방법이 없음 ㅠㅠ

 

~1900i : 밥먹고 연병장에서 야구하다 옴 ㅎㅎ 싸지방 복귀

 

~2000i : LAT[7], LON[7]에 값을 안 줘도 세그가 뜸.. 흐으으으ㅡㅇㅁ... 8번 이상 가면 다 뜨는듯

 

~2100i : 뭔지 진짜 모르겠음 점호청소하러감

 

~2400i : 리턴에 원샷가젯을 때리면 어떨까 생각함. ruby 설치 중 계속 오류떠서 삽질.. one_gadget 설치 성공

 

06/02

0400i : 챔스 ㅎㅎ..

 

0847i : LAT[7], LAT[8], LAT[9].. 에 값을 넣었더니 메인의 ret 이후 스택에 차곡차곡 쌓임!!! 이걸로 libc_base를 leak할 수 있을지 의문임

 

1125i : Return to csu를 사용하기로 함. 스택에 미리 저장해야 한다면 이게 제일 편할 것 같아서..

 

또 삽질중

ㅋㅋㅋㅋㅋㅋㅋ 수작업으로 구해버렸다 ㅎㅋㅎㅋㅎㅋㅎㅎ

LAT[7] LAT[8].... 여기다가 저 소수들을 때려박음 == main의 리턴부터 하나하나 저 값들이 박힘

결국 puts(puts@got)란 괴랄한 함수를 return to csu를 통해 만들어냄

 

결국 구함

leak 성공 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 이제 다 끝난듯

 

1133i : 끝난 줄 알았는데 libc_start + offset을 스택에 쌓아줄 방법이 없음 삽질도 못함 주소가 계속 바뀌니깐

 

1202i : ROP 공식인 write -> read -> got overwrite 에서 영감을 받아 puts -> fgets -> got overwrite를 시도해봄

 

힘들어..

 

정말 완벽한 return to csu 코드라고 생각했음!! 근데 fgets에서 세그오류뜸....... 왜......

write와 다르게 저거 안되나봄 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ 다른 방법 생각해봐야겠음

 

1256i : fgets가 안 된 이유를 찾은 것 같음

 

fatal error

rdx에 인자를 stdin으로 줬는데 (gdb 상에 0x602090이라 찍혀있었음) 그게 문제가 되는 듯

그럼 어케푸냐..

 

13:10i : 주소 leak할 때 스플릿을 잘못 해서 뒤에 0이 하나 더 붙음 ㅋㅋㅋ 수정했지만 여전히 안됨

 

1556i : 구글링 해봤는데 fgets의 첫 번째 인자가 포인터라고 함 나는 fgets@got를 그냥 때려박았으니 안되는 것 같음 다른 방법이 생각이 안난다.....

 

1630i : 표준 입력만 받을 수 있다면 다 될텐데.. 하는 마음에 main의 리턴을 chart_course의 시작으로 돌려보았다.

 

괴상한 놈

저 괴상한 구문에서 멈췄다.

IDA로 보면 어떻게 보일지 궁금하다ㅠㅠ

 

후기

 

대회가 끝난 후 write up을 찾아보니.. 파이썬에 binascii를 import해서 푸는 문제였어요..ㅎㅎㅎ..

 

수작업으로 열심히 소수 구했는데 ㅠㅠㅠㅠㅠㅠㅠ 허무하긴 합니다....

 

그래도 한 문제를 2일동안 미친듯이 뜯어보고 페이로드 때려보고 하면서 얻은 것이 많았습니다!!

메모리 leak은 쉬운 것이 아니라는 것과 생각보다 찾아야 할 가젯과 요소요소가 많다는 것 등등..

 

바로 다음 주에 미국 중고등학생들이 참여하는 HSCTF가 시작되는데요!! 

저도 슬쩍 한 번 껴보겠습니다 ㅎㅎ 한 문제라도 풀 수 있기를..!!!