首页
社区
课程
招聘
[原创]ret2csu学习
发表于: 2020-2-6 20:57 14667

[原创]ret2csu学习

2020-2-6 20:57
14667


用到的例子是蒸米的level5


x64 下面有一些万能的 gadget:objdump -d ./level5 显示特定的汇编(-D 显示全部的)

观察一下 _libc_csu_init 一般来说,只要是调用了 libc.so 就会有这个函数来对 libc.so 进行初始化



这里面有一些对寄存器操作的,需要注意的是 AT&T 与 8086 汇编语法有些区别


这些前面带百分号的极有可能是 AT&T 汇编,它的源操作数与目的操作数跟 8086 是反着的



通过构造栈上的数据,调用 1 然后返回到 2 就可以控制寄存器



首先通过溢出把一堆数据写在栈上,此时返回地址覆盖为 gadgets1,调用 gaegets1 的时候 rsp+8 通过 gadgets1 把栈上的数据写在寄存器里面,同时把 rsp 再加一下让程序返回到 gadgets2


gadgets2 会把之前寄存器上存的数据放在需要的寄存器上(参数存放顺序:RDI, RSI, RDX, RCX, R8 和 R9)


把 write 函数需要的参数部署好之后通过 call (r12+rbx*8) 之前把 rbx 设置成了 0,当程序执行完 write 函数以后会自己回到这里(因为是 call,正常调用)所以不用管返回地址,继续执行,此时还会执行 gadgets1 上面那张图那样子,gadgets1 里面有一段 add rsp,38h 所以还要填充 38h 个字节把这一段填充掉,使得程序返回的时候是我们写在栈上的 main_addr


write 函数原型是 write (1,address,len) ,1 表示标准输出流 ,address 是 write 函数要输出信息的地址 ,而 len 表示输出长度


第一发 payload



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

最后于 2020-2-6 20:59 被yichen115编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (7)
雪    币: 38
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
原来这叫ret2csu 还以为出了啥新技术了
2020-2-6 22:35
0
雪    币: 2510
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2020-2-6 23:03
1
雪    币: 359
活跃值: (14015)
能力值: ( LV13,RANK:606 )
在线值:
发帖
回帖
粉丝
4
ooOOOoomxw 原来这叫ret2csu 还以为出了啥新技术了
哈哈哈,在ctf-wiki上学的
2020-2-7 09:13
0
雪    币: 1515
活跃值: (4416)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
objdump -d ./level5 -M intel
2020-2-16 09:21
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
巨喜欢看师傅文章,其他的文章一般都不画堆栈原理图
2020-4-13 12:05
0
雪    币: 359
活跃值: (14015)
能力值: ( LV13,RANK:606 )
在线值:
发帖
回帖
粉丝
7
mb_gempvmht 巨喜欢看师傅文章,其他的文章一般都不画堆栈原理图
内容挺多的,我不画个图总是记乱了
2020-4-13 15:17
0
雪    币: 401
活跃值: (253)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8

非常感谢.jpg

最后于 2020-10-4 19:36 被Xor0ne编辑 ,原因:
2020-10-4 19:28
0
游客
登录 | 注册 方可回帖
返回
//