본문 바로가기

HackCTF67

[HackCTF] (Pwnable) Unexploitable_4 풀이 마지막시리즈다. 보호기법은 NX 가 꺼져있다. bss 에 쉘코드를 적어서 리턴하면 될텐데, dummy+sfp+ret 합쳐서 0x20 byte 여서 ret 넘어서 입력받을 수 있는 데이터는 13byte밖에 되지 않는다. 13byte 짜리 쉘코드는 찾아봤는데 없는 것같다. 그래서 23byte 쉘코드를 스택피보팅으로 나눠서 입력해보자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 from pwn import * # r=process("./Unexploitable_4") r=remote("ctf.j0n9hyun.xyz", 3039) context.log_level='debug' bss=0x601000+0x800 .. 2021. 5. 3.
[HackCTF] (Pwnable) Unexploitable_3 풀이 보호기법은 2와 마찬가지로 NX 정도 걸려있다. main 함수에서 0x90 만큼 오버플로우가 발생한다. gift 함수에는 fwrite 함수가 있는데, 밑부분을 보면, mov rcx, [rdi] 가젯이 있는데, 이걸로 fwrite 의 4번째 인자를 조작할 수 있다. fwrite(fgets@got, 1, 6, 0x601050 (stdout in bss)) 이렇게 호출하면 되는데, rdi, rsi, rdx 레지스터는 __libc_csu_init 가젯으로 맞추면 된다. pop rdi 가젯으로 rdi 에 bss 주소 넣기 mov rcx, [rdi] 가젯으로 rcx 에 stdout 이 들어가게 된다. 이제 csu 가젯으로 rdi, rsi, rdx 가젯을 세팅하고, fwrite 로 leak 을 한다. 다시 main .. 2021. 5. 3.
[HackCTF] (Pwnable) Unexploitable_2 풀이 이렇게 되어있다. 보호기법은 NX 정도? leak 하기 위해서는 fwrite 함수를 사용해야한다. fgets 함수를 실행하고 return할 때, 스택상태이다. rdi, rsi, rdx, rcx 값을 확인해보면, rcx 에 stdout 포인터가 남아있지않다. 컨트롤할 수 있는 레지스터는 rdi, rsi 정도인데 흠... 근데 system 함수가 주어져있기에, system 함수로 leak 을 할 수 있다. system함수에 잘못된 명령어가 들어가면, 그 명령어를 출력해주는데, got 주소를 인자로 system 함수를 호출하면, got 주소가 출력될 것이다. 위처럼 페이로드를 짜면 저렇게 출력이 된당. leak 한다음 원샷가젯을 호출하자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 .. 2021. 5. 3.
[Pwnable] (Heap) Heap Feng Shui 정리 ( feat . HackCTF 풍수지리설) Heap Feng Shui, 힙 풍수라고 읽고 Heap 영역에 할당된 Chunk 들의 Layout 을 조작해 exploit 하는 기법입니다. 풍수지리설 (400) 장소를 추가, 삭제, 업데이트 그리고 삭제할 수 있는 프로그램이다. 32bit 바이너리니까 ida32 로 열어보자. main 함수에서 중요 기능은 3부분이다. description 의 size 를 입력받고 add_location 호출 index 를 입력받고 delete_location 호출 index 를 입력받고 update_desc 호출 그리고 cnt 변수가 0x32 가 되면 종료해버린다. add_location v3 은 0x80 만큼 할당받은 곳. s 는 a1 만큼 할당받은 곳이다. 그리고 store[cnt]+4 에 0x7c 만큼 입력받는다.. 2021. 4. 17.