-
speedrun-009 - DEFCON 27Write-ups/CTFs 2020. 2. 22. 14:52
Prob Info
Checksec 모든 보호기법이 켜져있다.
Code
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) { setvbuf(stdout, 0LL, 2, 0LL); if ( !getenv("DEBUG") ) alarm(5u); banner(); vuln(); finish(); exit(0); }
"DEBUG"라는 환경변수가 있으면 5초 알람을 설정하지 않는다. 시작, 종료 배너를 출력해주고 그 사이에 실제 취약한 함수가 존재한다.
unsigned __int64 vuln() { char buf; // [rsp+7h] [rbp-4E9h] ssize_t v2; // [rsp+8h] [rbp-4E8h] char s; // [rsp+10h] [rbp-4E0h] char v4; // [rsp+D7h] [rbp-419h] char v5; // [rsp+E0h] [rbp-410h] unsigned __int64 v6; // [rsp+4E8h] [rbp-8h] v6 = __readfsqword(0x28u); while ( 1 ) { menu(); v2 = read(0, &buf, 1uLL); if ( v2 != 1 ) break; if ( buf == '1' ) { read(0, &v5, 0x5DCuLL); } else { if ( buf != '2' ) return __readfsqword(0x28u) ^ v6; read(0, &s, 0xC8uLL); v4 = 0; if ( strchr(&s, 'n') ) { puts("nope"); } else { printf("Is that it \"", 'n'); printf(&s); puts("\"?"); } } } return __readfsqword(0x28u) ^ v6; }
1, 2, 3번 메뉴가 존재하는데, 1번은 v5 부터 0x5dc (1500)만큼 입력받고, 2번은 s에 0xc8바이트를 입력받아 fsb를 일으킨다.
canary와 s사이의 거리가 꽤 되기 때문에 %p로 찾기가 어려운데, 그냥 v5에다 b를 canary직전까지 채워 넣고 0x6262626262626262 값이 끊기는 시점을 찾으면 된다.
그 뒤 8바이트가 canary이고, 그 뒤가 sfp, 그 뒤가 ret으로 각각 canary, stack, pie를 릭할 수 있고, 더 위로 올라가면 main함수의 ret, 즉 __libc_start_main+240 값을 릭 할 수 있으므로 libc릭까지 가능하다. 이를 이용해 1번 메뉴로 그대로 one_gadget으로 ret을 덮어 쉘을 따면 된다.
'Write-ups > CTFs' 카테고리의 다른 글
feedme - DEFCON 2016 (0) 2020.03.01 houseoforange - HITCON 2016 (0) 2020.02.27