본문 바로가기

전체 글157

pwnable.kr [Rookiss] tiny_easy 보호되어 있는 글 입니다. 2019. 5. 17.
pwnable.kr [Rookiss] dragon 보호되어 있는 글 입니다. 2019. 5. 15.
pwnable.kr [Rookiss] simple login 보호되어 있는 글 입니다. 2019. 5. 14.
HackCTF - [Reversing] Welcome_REV 보호되어 있는 글 입니다. 2019. 5. 3.
HackCTF - [Reversing] Reversing Me 보호되어 있는 글 입니다. 2019. 5. 3.
pwnable.kr unlink [Toddler's Bottle]pwnable.kr unlink unlink 파일을 보면 nx가 걸려있는 것을 볼 수 있다. 아래는 unlink.c 코드의 일부이다. gets() 에서 overflow가 발생한다.또한 unlink() 함수를 보면 값에 검증을 수행하지 않는 것을 볼 수 있다. 실제로 gets()에서 "A"를 100개 입력해보았다. 그 결과, 아래와 같이 입력한 값이 그대로 들어간다.즉, 첫번째 malloc() 한 A의 size보다 많이 입력하면, B와 C를 덮을 수 있다. 여기서 처음 든 생각은 stack leak 값을 이용하여 ret를 shell()의 주소로 덮는 것이었으나,FD에 코드 영역의 주소를 넣으면 FD->bk=BK; 부분에서 코드 영역에 write를 해야 하므로 힘들 듯하다. .. 2019. 3. 12.
pwnable.kr horcruxes [Toddler's Bottle]pwnable.kr horcruxes 아래와 같은 2개의 파일을 볼 수 있다. 32비트임을 알 수 있다. 먼저 main() 은 아래와 같다. ropme() 함수의 일부를 보면 아래와 같이 플래그를 주는 부분이 존재한다.이 때, sum과 같은 값을 입력해야 플래그가 출력된다. s에서 overflow가 발생한다. sum은 init_ABCDEFG() 함수 내부에서 확인할 수 있다.a, b, c, d, e, f, g를 더한 값이다. 여기서 다시 ropme() 함수를 보면 A(), B(), C(), D(), E(), F(), G()를 호출하는 부분을 볼 수 있다. 각각의 함수 내부에서 대응되는 변수의 값들을 출력 해준다. 따라서 rop를 이용하여 A(), B(), C(), D(),.. 2019. 3. 6.
pwnable.kr uaf [Toddler's Bottle] uaf uaf.cpp 코드의 일부이다. give_shell() 함수를 호출할 수 있으면 될 것으로 보인다. 아래는 main() 코드이다. 이 때, switch문의 case 2를 이용하면 uaf가 가능할 듯하다. gdb로 보면 fastbin에 들어가는 것을 볼 수 있다. 따라서 argv[1]으로 같은 크기를 주고 실행한 뒤3 -> 2 순으로 입력하여 free로 인해 반환된 메모리를 다시 할당받으면 된다.이제 해당 메모리에 덮어쓸 데이터만 결정하면 된다. 이 때, 다시 uaf.cpp 코드를 보면 give_shell()과 introduce()가 virtual 함수인 것을 볼 수 있다.free하기 이전의 힙 상태를 다시 보면 아래와 같다. vtable의 주소가 담겨 있는 것을 .. 2019. 2. 21.
pwnable.kr memcpy memcpy.c 코드를 보면, for문을 10회 돌면 플래그를 얻을 수 있을 것으로 보인다. fast_memcpy() 부분 코드이다. 실행을 해보면, movntps에서 segmentation fault가 발생하는 것을 볼 수 있다.그 이유는, 16바이트로 align 되어 있지 않기 때문이다. main() 코드를 다시 보면, 입력한 size 크기만큼 malloc하기 때문에(16의 배수 - heap_header_size) 의 크기를 입력해주었다. exploit 코드는 아래와 같다. 실행 결과 플래그를 얻을 수 있다. [exploit.py]from pwn import * r = remote('pwnable.kr', 9022) for i in range(10): data = str(int(r.recvuntil(.. 2019. 2. 13.