首页
社区
课程
招聘
[求助]求助一题python脚本的 格式化字符串 pwn
2023-10-10 23:14 3339

[求助]求助一题python脚本的 格式化字符串 pwn

2023-10-10 23:14
3339

遇见一题python脚本的 格式化字符串相关漏洞程序,大致思路是泄露libc地址后得到system地址后覆盖返回地址。想知道这种程序payload该怎么写,如何确认要覆盖的返回地址?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 267
活跃值: (625)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hypersine 2023-10-11 01:17
2
1
你可以用gdb调试python脚本,先断在libc的printf,观察下栈上的数据哪些和当前的rsp寄存器值有固定差值(一般这些数据都是前一个函数压入的栈帧rbp),这样就可以根据printf泄漏的数据推断printf调用时的栈地址。

然后断在libc的read,观察下read的rsp和printf的rsp是否有固定的差值。我感觉这里差值很可能是固定的。如果是这样,那这样read函数调用时的rsp也可以计算出来,剩下的就是覆盖retaddr、随你干什么了。
雪    币: 198
活跃值: (352)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
astonecutter 2023-10-11 08:29
3
0
hypersine 你可以用gdb调试python脚本,先断在libc的printf,观察下栈上的数据哪些和当前的rsp寄存器值有固定差值(一般这些数据都是前一个函数压入的栈帧rbp),这样就可以根据printf泄漏的数 ...
对的对的,是这个思路,所以是在第二次read环节覆盖main 的返回地址么
雪    币: 267
活跃值: (625)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hypersine 2023-10-11 11:42
4
0
astonecutter 对的对的,是这个思路,所以是在第二次read环节覆盖main 的返回地址么
想覆盖哪里就自己决定了咯,要我的话应该会选read的返回地址,毕竟往栈底走那是python的栈布局,不太好控制
雪    币: 198
活跃值: (352)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
astonecutter 2023-10-11 22:39
5
0
hypersine 想覆盖哪里就自己决定了咯,要我的话应该会选read的返回地址,毕竟往栈底走那是python的栈布局,不太好控制
大佬大佬,你打通了么,能不能看看wp 我利用read写入某个栈上地址总是不成功,好奇怪。
雪    币: 267
活跃值: (625)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hypersine 2023-10-12 02:12
6
1

注意调整下pwn.ELF那里libc.so.6文件的路径,指向你附件里的libc.so.6就行。还有pwn.remote那里,注意改成题目的host和port。

上传的附件:
雪    币: 198
活跃值: (352)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
astonecutter 2023-10-12 07:23
7
0
hypersine 注意调整下pwn.ELF那里libc.so.6文件的路径,指向你附件里的libc.so.6就行。还有pwn.remote那里,注意改成题目的host和port。
感谢gracias 
雪    币: 198
活跃值: (352)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
astonecutter 2023-10-17 08:21
8
0
hypersine 注意调整下pwn.ELF那里libc.so.6文件的路径,指向你附件里的libc.so.6就行。还有pwn.remote那里,注意改成题目的host和port。
大佬,我调通了你的代码,但是我不太理解1.覆盖的read_rsp的地址是怎么计算的。2.我学习的时候都是根据rbp➕8 确定返回地址的,覆盖这个地址read_rsp是怎么被读取到rip执行的
雪    币: 267
活跃值: (625)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hypersine 2023-10-17 14:08
9
0
astonecutter 大佬,我调通了你的代码,但是我不太理解1.覆盖的read_rsp的地址是怎么计算的。2.我学习的时候都是根据rbp➕8 确定返回地址的,覆盖这个地址read_rsp是怎么被读取到rip执行的
1. 代码里不是很清楚了吗,read_rsp = printf_rsp - 0x60
read_rsp是表示到达libc.so read函数时(即rip指向read函数第一条指令时)的rsp,printf_rsp也同理。这个0x60常数就是前面我说的“观察下read的rsp和printf的rsp是否有固定的差值”中的差值。

2. read_rsp中存储的就是函数的返回地址啊,因为函数不都是call过去的吗?所以函数第一条指令时的rsp不就存储着call压进去的返回地址吗?rbp+8只能说是大部分情况下是放着返回地址的,但你不能保证目标函数就是拿着rbp当栈帧指针,有可能rbp另作他用呢?或者在push rbp、mov rbp, rsp前还压了其他寄存器呢?
雪    币: 198
活跃值: (352)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
astonecutter 2023-10-17 14:12
10
0
hypersine 1. 代码里不是很清楚了吗,read_rsp = printf_rsp - 0x60 read_rsp是表示到达libc.so read函数时(即rip指向read函数第一条指令时)的rsp,pri ...
好滴,明白了~谢谢解惑
游客
登录 | 注册 方可回帖
返回