printf, read?

문제는 해결했습니다. 하지만 got overwrite을 해줄때 처음에 printf나 read의 got를 overwrite해주려고 해보았는데 안되고 다른 함수의 got를 overwrite해서서 해결하게 되었습니다. 근데 printf,read의 got를 overwrite했을 땐 왜 안되는지 잘 모르겠는데 그 이유에 대해서 고수분들께서 도와주셨으면 합니다. ㅎㅎㅎ

#pwnable
작성자 정보
답변 3
포고로모
대표 업적 없음

혹시 해결하셨나요? 저도 free의 got를 overwrite하려 했는데, free_got를 get_shell()로 덮어쓰는 순간 crash가 나버리네요.. FisMA님께서 질문하신 것과 비슷한 이유로 crash가 나는 것 같은데, 혹시 질문하신 내용의 이유를 찾으셨나요?

2023.07.31. 23:41
dong_
대표 업적 없음

이미 오랜시간이 지나서 의미있을지 모르겠지만..

Disassembly of section .plt.sec:

00000000004010d0 <free@plt>:
  4010d0:       f3 0f 1e fa             endbr64
  4010d4:       f2 ff 25 3d 2f 00 00    bnd jmp QWORD PTR [rip+0x2f3d]        # 404018 <free@GLIBC_2.2.5>
  4010db:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

00000000004010e0 <puts@plt>:
  4010e0:       f3 0f 1e fa             endbr64
  4010e4:       f2 ff 25 35 2f 00 00    bnd jmp QWORD PTR [rip+0x2f35]        # 404020 <puts@GLIBC_2.2.5>
  4010eb:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

00000000004010f0 <__stack_chk_fail@plt>:
  4010f0:       f3 0f 1e fa             endbr64
  4010f4:       f2 ff 25 2d 2f 00 00    bnd jmp QWORD PTR [rip+0x2f2d]        # 404028 <__stack_chk_fail@GLIBC_2.4>
  4010fb:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

0000000000401100 <system@plt>:
  401100:       f3 0f 1e fa             endbr64
  401104:       f2 ff 25 25 2f 00 00    bnd jmp QWORD PTR [rip+0x2f25]        # 404030 <system@GLIBC_2.2.5>
  40110b:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

0000000000401110 <printf@plt>:
  401110:       f3 0f 1e fa             endbr64
  401114:       f2 ff 25 1d 2f 00 00    bnd jmp QWORD PTR [rip+0x2f1d]        # 404038 <printf@GLIBC_2.2.5>
  40111b:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

0000000000401120 <read@plt>:
  401120:       f3 0f 1e fa             endbr64
  401124:       f2 ff 25 15 2f 00 00    bnd jmp QWORD PTR [rip+0x2f15]        # 404040 <read@GLIBC_2.2.5>
  40112b:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

0000000000401130 <malloc@plt>:
  401130:       f3 0f 1e fa             endbr64
  401134:       f2 ff 25 0d 2f 00 00    bnd jmp QWORD PTR [rip+0x2f0d]        # 404048 <malloc@GLIBC_2.2.5>
  40113b:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

0000000000401140 <setvbuf@plt>:
  401140:       f3 0f 1e fa             endbr64
  401144:       f2 ff 25 05 2f 00 00    bnd jmp QWORD PTR [rip+0x2f05]        # 404050 <setvbuf@GLIBC_2.2.5>
  40114b:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

0000000000401150 <__isoc99_scanf@plt>:
  401150:       f3 0f 1e fa             endbr64
  401154:       f2 ff 25 fd 2e 00 00    bnd jmp QWORD PTR [rip+0x2efd]        # 404058 <__isoc99_scanf@GLIBC_2.7>
  40115b:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

0000000000401160 <exit@plt>:
  401160:       f3 0f 1e fa             endbr64
  401164:       f2 ff 25 f5 2e 00 00    bnd jmp QWORD PTR [rip+0x2ef5]        # 404060 <exit@GLIBC_2.2.5>
  40116b:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

제생각에는 read 함수 호출중인 상태에서 read함수보다 위에있는 함수(예를들어 printf)들의 got값을 수정하면 read함수의 got값이 수정되면서 crash가 발생하는것 같습니다.
제 코드에서는 printf함수에 값을 덮어씌우면 crash가 발생합니다.

2024.01.18. 12:09
account
대표 업적 없음

디버깅 해보니 malloc내의 e->key = NULL; 때문에 하나의 got을 덮어쓰려고 할 때 그 바로 뒤에 있는 got이 0으로 덮어 씌워짐으로써 발생하는 문제입니다. 예를 들어 exit을 원하는 주소로 덮어씌우기 위해 malloc을 하면 그 바로 뒤에있는 puts의 got이 0이 되기 때문에 menu를 출력할때 종료됩니다

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