题目分析
-
第一个read可溢出8字节,通过gdb调试buf+0x20的位置是_IO_2_1_stderr_的地址所以填充满泄露即可,所以libc_base是白给的
-
字符串中不能包含if中的字符(若发送地址也不能包含)
-
格式化字符漏洞
思路
-
通过格式化字符串漏洞改写libc中strlen的got表地址为one_gadget
-
程序执行完printf(s),接着就执行puts(),puts()会调用strlen函数
puts.c:
libc->puts:
puts函数调用自己的got表进行strlen函数定位(libc没有开启got不可写):
注:在非伪代码下双击追踪,否则会直接转跳到strlen函数
所以只需要更改libc中strlen的got表为og便可以获取shell
过程
注:libc里面的got表不能通过 libc.got[‘puts’]获取偏移需要自己收到找地址,我也不知道为啥不能用,反正这样写就会报错
- 将rbp指向 存有_IO_2_1_stderr_的指针,操作如下
- 通过第二个框中的链,将0x7ffc0e22b6a0改写成0x7ffc0e22b650
0x7ffc0e22b670 —▸ 0x7ffc0e22b690 —▸ 0x7ffc0e22b6a0 ◂— 0x0
有概率成功,成功后结构如下:
- 此时我们就可以通过rbp的位置将_IO_2_1_stderr_改写为strlen_got,结果如下: