목록2021/05/11 (3)
Sechack

void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) { int v3; // eax sub_400846(); while ( 1 ) { sub_4008DA(); v3 = (char)sub_4008A7(); switch ( v3 ) { case 50: sub_40097F(); break; case 51: sub_4009DD(); break; case 49: sub_400910(); break; } } } IDA로 까봤는데 stripped가 걸려있다. 그래도 바이너리가 워낙 간단해서 분석하는데 어려움은 없었다. int sub_4008DA() { puts("1. make wish"); puts("2. view wish"); return puts("..
ASLR로 인해서 stack, heap, libc의 base주소가 프로그램 실행할때마다 매번 변한다. 따라서 우리는 libc를 이용해서 exploit하려면 취약점을 이용해서 libc주소를 leak하고 적절한 offset연산을 거쳐서 base주소를 구해야 한다. libc를 leak하는데는 여러가지 방법이 있다. 가장 일반적이고 떠올리기 쉬운건 fsb가 터질때 %p를 이용해서 leak하거나 bof가 터질때 rop chain으로 puts, write와 같은 출력함수들을 이용해서 함수 got와 같은 libc주소를 담고 있는 메모리 공간을 출력해주는 것이다. 아니면 스택에 libc주소가 정리 안되고 남아있을수가 있다. printf같은 함수는 NULL을 만나기 전까지 출력해주므로 스택에 libc나 stack주소가 ..

IDA로 보면 굉장히 심플하다. 문제 이름앞에 baby가 붙어있으면 대부분 매우 어려워서 이번문제에는 어떤 hard한 요소가 있을까 하고 봤는데 진짜 간단한 fsb였다. babyheap도 그렇고 HackCTF만 baby붙은게 진짜 쉽다. checksec으로 보호기법 보기 전까지 full relro면 어떡하나 바짝 긴장했었다. baby라는 이름이 나를 긴장하게 만든다... 다행히도 Partial이다. 이러면 got overwrite가 가능하다. 문제는 1번 입력받고 프로그램이 바로 꺼진다는거였는데 read함수에서 카나리를 변조할 수가 있으므로 이건 간단하게 __stack_chk_fail함수 got를 main으로 덮어서 해결 가능하다. got에는 맨처음에 plt+6의 주소가 들어가고 그다음부터 libc에 매..