Bcloud 문제와 마찬가지로 House of Force 문제이다. recipe를 출력해주는 함수에서 leak을 할 수 있다. 그 전에 recipe+4가 0이 아니면 인스턴스의 수를 구하는 함수가 있는데계속 거기서 터졌다. 그래서 \x00을 124개 채워주고 leak할 값을 넣어주면 된다.printf("recipe type: %s\n", *(recipe + 124)); 물론 이것도 그냥하면 안되고```malloc(1036); free(alloced_chunk); ```를 먼저 해줘서 UAF를 이용해 Leak을 해야한다. 뭔가 엄청 시간이 오래걸린 문제다. Top chunk를 계산할떄도 free된 chunk를 신경안쓰고 그냥 구해서 Top chunk가 잘 안구해졌다. 왜인지 계속leak된 heap addr..
Heap exploit task. House of Force 에 관한 문제 아래 링크 포스트를 쓴 계기가 된 문제이다.http://err0rless313.tistory.com/entry/The-House-of-Force-kor BCTF 당시 푼 문제가 아니라서 LIBC파일을 줬는지 모르겠으나 github에 같이 있는걸 보면 준듯 하다.그래서 따로 LIBC를 leak해서 libc version을 구하진 않았고 local환경의 LIBC로 처리했다. 일단 House of Force에 관한 문제이기 때문에 Heap의 위치, 그리고 Top chunk에 0xffffffff을 덮어 씌워야 했고,처음 받는 name, org, host에 각각 "A" * 64, "A" * 64, "\xff\xff\xff\xff"을 넣어주..
32c3 CTF 2015 teufel mmap으로 mapping하는 부분과 mprotect로 권한 바꿔주는 부분을 잘 봐야 하는 문제, 아래 정보들을 가지고 익스플로잇을 하면 됨. (gdb) info proc exe process 30785 exe = '/root/pwnable/32c3CTF/teufel' (gdb) shell cat /proc/30785/maps ... 7ffff7ff3000-7ffff7ff4000 ---p 00000000 00:00 0 7ffff7ff4000-7ffff7ff5000 rw-p 00000000 00:00 0 [stack:30785] 7ffff7ff5000-7ffff7ff6000 ---p 00000000 00:00 0 ... (gdb) x/wx $rsp + 0x08 0x7f..
엄청어려워서 거의 못풀었지만 그만큼 좋은 문제가 많았던 32c3 ctf였던거 같다. https://github.com/ctfs/write-ups-2015/tree/master/32c3-ctf-2015 라이트업 보면서 공부하자 http://pastebin.com/Xd8jrhqV 처음에 풀때 &flag를 argv[0]에 넣어서 (오버플로우가 발생하니) stack_chk_fail에서 릭하는걸 목표로 했었는데도무지 canary messgae가 안나와서 거의 포기상태로 풀지 못했는데 LIBC_FATAL_STDERR_이라는 환경변수에 1을 넣어주면stderr도 출력 된다캄. 신기해! 그리고 flag는 원래 덮어씌워 져야 하지만 플래그를 fopen으로 가지고 오는게 아니라 바이너리에 직접 넣어줬기 때문에바이너리 영역..
ROP면서도 신경쓸 게 많았던 문제였던 것 같다.cd80님이 힌트를 주신것들을 활용해 보면서 풀어봤고 sprintf를 이용하여 free-address에 // 0x00이 들어가면 안되기 때문에payload를 복사해 주고 Fake-EBP기법을 통해 payload를 실행해주고 쉘코드를 이용하여 풀어봤다.바이너리에 NX-Bit는 적용되어 있지 않다. 최대한 깔끔하게 exploit코드를 구성하려고 노력했고 sprintf를 13번정도 이상 실행하면 오류가 나서 read@got를 이용하여(read.plt+6을 가르키고 있는 포인터) free-address에 read.plt를 복사해 주었다. 그리고 s.send(sc)를 해주기 전에 print s.recv(1024)를 해줬었는데 그 다음으로 넘어가지 않는 현상이 발생했..
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869from err0rless import *import struct def getPassword(): s, t = connectSocket("192.168.95.148", 8777) print t.read_until("Password : ") t.write("A" * 0x11D + struct.pack("