ctf-wiki基本ROP1-ret2text学习笔记

参考链接:
https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/basic-rop/
https://www.jianshu.com/p/450361bce332

首先,查看一下程序的保护机制
在这里插入图片描述
可以看出程序是 32 位程序,其仅仅开启了栈不可执行保护。然后,我们使用 IDA 来查看源代码。
在这里插入图片描述
可以看出程序在主函数中使用了 gets 函数,显然存在栈溢出漏洞。此后在 secure 函数又发现了存在调用 system(“/bin/sh”) 的代码
在这里插入图片描述
在这里插入图片描述
那么如果我们直接控制程序返回至 0x0804863A,那么就可以得到系统的 shell 了。
所以我们现在要知道输入多少个字符会导致栈溢出

IDA上静态分析看到的东西有时和实际上运行的情况不一样,所以有时候需要进行动态分析,利用gdb等工具(IDA debug环境也可)
https://blog.lxscloud.top/2021/07/03/2021-06-06-Pwn%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/

计算偏移量:
①使用pattern:
对pwn1进行gdb调试

$ gdb ret2text

在这里插入图片描述
生成溢出字符,需保证其长度能覆盖至RIP

$ pattern create 200

在这里插入图片描述
执行 r 或者 start 命令让程序运行。

注意:start 命令执行后,还需执行 contin 命令
在这里插入图片描述

在这里插入图片描述

在 please input 后,将之前生成的溢出字符串粘贴上去。
注意:不要加‘’
在这里插入图片描述

找到RBP的字符串

$ pattern offset  MAAi

在这里插入图片描述
这里计算出的偏移量。不需要考虑堆栈平衡。构造playload时,直接与系统调用地址相加就可。(64位+8;32位+4)
或者:
Invalid address 0x41384141,得出偏移地址

$ pattern offset 0x41384141

在这里插入图片描述

②使用cyclic
生成200个有序字符

$ cyclic 200

在这里插入图片描述
gdb调试

$ gdb ret2text

在这里插入图片描述
执行并贴上有序字符

gdb-peda$ r

aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab

在这里插入图片描述

有溢出点,Invalid $PC address: 0x62616164,cyclic -l 地址 计算偏移量

$ cyclic -l 0x62616164

在这里插入图片描述
这里计算出偏移量。


首先需要确定的是我们能够控制的内存的起始地址距离 main 函数的返回地址的字节数。

.text:080486A7                 lea     eax, [esp+1Ch]
.text:080486AB                 mov     [esp], eax      ; s
.text:080486AE                 call    _gets

可以看到该字符串是通过相对于 esp 的索引,所以我们需要进行调试,将断点下在 call 处,查看 esp,ebp,如下:
在这里插入图片描述
在这里插入图片描述
可以看到 esp 为 0xffffd0b0,ebp 为 0xffffd138,同时 s 相对于 esp 的索引为 esp+0x1c,因此,我们可以推断:
·s 的地址为 0xffffd0cc
·s 相对于 ebp 的偏移为 0x6c=108
·s 相对于返回地址的偏移为 0x6c+4=112

写exp:

vim ret2texte.py

在这里插入图片描述
运行exp:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值