목록2021/04 (4)
Sechack

앞에 3문제는 그냥 기초적인 rop라서 딱히 적을게 없는데 이문제는 함수의 특성을 제대로 고려하지 못해서 많은시간 삽질한 문제라서 풀이 남깁니다... int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { __int64 v3; // rdx __int64 v4; // rdx int v5; // ST0C_4 signed int v6; // [rsp-160h] [rbp-160h] __int64 v7; // [rsp-158h] [rbp-158h] __int64 v8; // [rsp-150h] [rbp-150h] const char *v9; // [rsp-148h] [rbp-148h] __int64 (__fastcall **v10..

키야 ~~~~~~ 처음으로 퍼블먹어본 문제이다. 첫 퍼블과 동시에 처음으로 CTF에서 처음으로 포너블 올클해봤다. 쾌감... 일단 이문제 취약점은 off by one이다. 이거 알아내기까지 은근 삽질 많이했다. main을 보니까 메뉴를 선택해서 해당 역할을 수행하는것같다. 실행해보자. 대충 이렇습니다. 이제 각자 메뉴가 어떤일을 하는지 분석해봅시다. 먼저 1번 메뉴이다. 여기서 off by one이 터진다. 하지만 캐치해내기까지 꽤 걸렸다. 이부분은 이따가 3번 메뉴를 보면 off by one이 어떻게 익스플로잇과 연계되는지 알 수 있다. 저거 캐치한뒤에는 거의 10분안에 플래그 얻은것같다. 저기서 눈여겨봐야하는 부분이 qword_6020C0[i] 이부분과 qword_602120[i] = 32LL; 이부..

처음에 숫자를 입력받는다. 그리고 입력받은 숫자를 기반으로 다음 입력때 사용할 스택 주소를 연산하는것 같았다. 그리고 연산된 주소에다가 0x78만큼 입력받는다. 연산하는 부분을 어셈으로 보면 덧셈, 뺄셈, 곱셈, 시프트 연산 등을 하는걸 볼 수 있다. 우리는 연산된 주소와 ret까지의 offset이 0x78을 넘지 않도록 만들면 된다. 저걸 다 분석할수도 있지만 귀찮아서 그냥 -1넣어봤다. 그리고 gdb로 보니까 ret까지의 offset이 0x28이 나오는것이다. 그래서 그냥 -1넣고 진행하였다. 옆에보면 pop rax, rdi, rsi. rdx, syscall 전부 가젯을 제공해주는걸 알 수 있다. 따라서 저걸 사용해서 sysrop해서 /bin/sh기록하고 execve호출하면 되는것이다. 보니까 bss..

처음으로 풀어본 CTF힙문제이다. 고득점 문제여서 풀고나서 매우 뿌듯했다. 프로그램은 매우 간단했다. 원하는 사이즈로 청크를 할당받을 수 있고 해제할 수 있다. add함수는 전역변수에 우리가 입력한 사이즈만큼 malloc을 한다. view함수는 전역변수에 들어있는 값을 출력해주고 있었다. delete 함수는 전역변수를 free해준다, PS: The challenge uses the good old Ubuntu 18.04 libc ;) 문제에서도 이렇게 힌트를 주면서 double free가 그냥 된다는것을 알려주고 있다. 실제로 double free에 대한 검증이 없는 libc였다. 근데 full relro가 걸려있었다. 역시 호락호락하게 풀리게 주진 않는다... got overwrite가 불가능하니 fr..