While writing the feedback form for idekCTF, JW made a small typo. It still compiled though, so what could possibly go wrong? nc typop.chal.idek.team 1337
[155 solves / 408 points]
Analysis
1 2 3 4 5
Arch: amd64-64-little RELRO: Full RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled
mitigation은 위와 같고, 프로그램 구조는 main 함수에서 while로 getFeedback 함수를 계속 호출하는 구조이다.
v3 = __readfsqword(0x28u); buf = 0LL; v2 = 0; puts("Do you like ctf?"); read(0, &buf, 0x1EuLL); // bof printf("You said: %s\n", (constchar *)&buf); if ( (_BYTE)buf == 121 ) printf("That's great! "); else printf("Aww :( "); puts("Can you provide some extra feedback?"); read(0, &buf, 0x5AuLL); // bof return __readfsqword(0x28u) ^ v3; }
bof가 두 번 발생한다. win 함수가 존재하지만 인자 세 개를 컨트롤 해야해서 사용하기 까다롭다. csu gadget을 이용해야하는데 길이 제한 및 모든 보호기법이 다 걸려있어서 got를 덮을 수가 없어 사용하기가 매우 까다롭다. (2023.01.18 update) 착각했다. csu_gadget으로 풀이하는 것이 인텐이고 해당 풀이는 아래 링크로 확인할 수 있다.
그래서 win 함수를 실행시키는 방향이 아닌 쉘을 획득하는 방향으로 풀이를 진행했다. 첫 번째로 터지는 bof에서 stack, canary, pie를 leak 할 수 있고 이로 인해 rop를 진행하여 libc 주소 또한 구할 수 있다. 결국 그냥 system("/bin/sh\x00")를 실행시켜 쉘을 획득하고 flag를 읽으면 된다.