Got overwrite와 /bin/sh 입력하는 과정에서...

강의에서 Got overwrite 와 /bin/sh을 하는 코드가 있습니다,

  1. 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)
2. # read("/bin/sh") == system("/bin/sh")
payload += p64(pop_rdi)
payload += p64(read_got+0x8)
payload += p64(read_plt)
여기서의 의문인 점은

  1. read(0,read_got,0)는 나중에 올 send(payload)를 위해서 작성해 놓은건가요 ?
  2. 위 페이로드에서 read("/bin/sh") == system("/bin/sh") 페이로드가 got overwrite을 하는 페이로드라는 것 까지는 알았는데 저 페이로드의 과정을 잘 모르겠습니다. 구체적으로는 왜 read_got+0x8 이 인자가 /bin/sh 역할을 하고 read가 system으로 overwrite 됐다! 라는 것을 어떻게 확인할 수 있나요?
#시스템_해킹 #공격기법 #rop
작성자 정보
답변 1
avatar
ainsetin
Open Beta Tester
  1. payload를 read 하는 부분은 이미 프로그램을 실행하는 과정에서 수행되고, 추가적으로 read_got 부분에 입력을 받아 overwrite 하기 위해서 저렇게 gadget과 해당하는 값을 미리 세팅하는 것입니다. overwrite 하는 과정은 send(payload) 다음에 존재하는 system 주소와 /bin/sh\x00 문자열의 총 16byte를 입력하기 위해 존재합니다.
  2. gdb 동적 디버깅으로 python exploit code 실행 도중의 상황을 보면서 덮어졌는지 확인할 수 있습니다. pause()gdb.attach(p)와 같은 방식을 활용하여 디버깅이 가능합니다. read_got+0x8이라는 주소는 /bin/sh\x00 이라는 문자열의 주소이며, 이는 system("/bin/sh\x00")을 실행하기 위해 첫번째 인자인 rdi로 들어가게 됩니다.
2023.01.08. 23:06
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기