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가 나는 것 같은데, 혹시 질문하신 내용의 이유를 찾으셨나요?
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가 발생합니다.
account
2024 Invitational Contenders
디버깅 해보니 malloc내의 e->key = NULL; 때문에 하나의 got을 덮어쓰려고 할 때 그 바로 뒤에 있는 got이 0으로 덮어 씌워짐으로써 발생하는 문제입니다. 예를 들어 exit을 원하는 주소로 덮어씌우기 위해 malloc을 하면 그 바로 뒤에있는 puts의 got이 0이 되기 때문에 menu를 출력할때 종료됩니다