본문 바로가기

Wargame/pwnable.kr32

pwnable.kr [Rookiss] dragon 보호되어 있는 글 입니다. 2019. 5. 15.
pwnable.kr [Rookiss] simple login 보호되어 있는 글 입니다. 2019. 5. 14.
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.
pwnable.kr blukat 소스코드는 아래와 같다. password 파일과 같은 값을 입력하면 된다. 그런데 id를 입력해보면, group에 blukat_pwn이 있는 것을 볼 수 있다.즉, password 파일의 읽기 권한이 주어졌다. vi를 통해 들어가면 아래와 같은 패스워드를 볼 수 있다.cat password를 통해서 보면, 마치 권한이 없어서 읽을 수 없는 것처럼 속을 수 있다......! 만약 이 것을 눈치채지 못하였더라도, gdb를 통해 입력받은 값을 볼 수 있다. password에 들어 있던 값이 담긴 것을 볼 수 있다. 따라서 다음과 같이 입력하면 플래그를 얻을 수 있다. 2019. 2. 11.
pwnable.kr leg pwnable.kr leg 문제이다. 문제를 보면 파일을 두개 다운받을 수 있다. 먼저, leg.c 파일의 main()을 보면, ( key1() + key2() + key3() )의 값을 입력하면 플래그를 얻을 수 있을 것으로 보인다. [key1]첨부된 asm 파일에서 먼저 key1 부분은 아래와 같다. 필요한 값은 key1()의 리턴 값이기 때문에, r0에 담기는 값을 보면 된다. mov r3, pcmov r0, r3이기 때문에 mov r3, pc에서 pc 값을 알아오면 된다. 이 때, pipeline(fetch, decode, execute) 으로 인해 0x00008cdc 가 fetch 될 때의 pc는 0x00008ce4 이다. [key2] key2에서도 r0에 담기는 값을 보면 된다. r0와 관련된.. 2019. 2. 11.
pwnable.kr shellshock ssh shellshock@pwnable.kr -p2222 먼저 아래와 같은 파일을 볼 수 있다. 코드는 아래와 같다. 문제 이름에서도 알 수 있듯 이번 문제는 shellshock 취약점을 이용하여 풀 수 있다. shellshock와 관련해서는 검색해보면 자세한 설명과 관련 CVE 등을 볼 수 있다. ​env x='() { :;}; echo hello' bash -c "echo world"여기서 다시 shellshock.c를 보면 system("/home/shellshock/bash -c 'echo shock_me'")가 있다. 따라서 env x='() { :;}; echo hello' ./shellshock를 해준다. 여기서 echo hello 부분을 cat flag로 바꾸면 플래그를 얻을 수 있다. 2019. 2. 1.