首先checksec一下
32位
只开启了栈可执行保护
ida打开
查找/bin/sh
binsh = 0x804863A
距离ebp的距离需要利用Ubuntu中gdb工具
gdb ./ret2text
因为存储读入的变量和到栈底的距离未知所以断点下在_gets
b *0x80486AE
别忘了再按r,报错不用管
借助变量s到esp的距离计算出s的地址
再计算变量s到esp的距离
用Python:
ebp = 0xffffcfd8 esp = 0xffffcf50 print hex(esp + 0x1c - ebp)得到运算结果-0x6cL
所以需要填充0x6c个字符
至此,已经得到填充缓冲区的字符数为0x6c
system返回的/bin/sh程序地址为0x804863A
于是构造payload
python ret2text.py
cat flag
flag{5e22ee8d-07f0-4089-94c2-d5e14c84f331}
来源nuaactf 首先拖到Ubuntu checksec一下 64位,只开启了栈可执行保护 64ida打开
ida 图标是Ada Lovelace 哄哄哄
几个函数点进去可以看到 基本上就是输入1853186401到dword_60106c 那么执行sub_400686于是cat flag.txt 我们有输入权限的unk_601068,我们输入c-8=4位就可以覆盖到dword_60106c 于是构造payload
python hello.py
cyberpeace{ec8ff6fef0bd58198cf3e64228e62cb4} 动态滴~
哦哦 !看到一种简单的输入方式 1853186401按r->nuaa 4位溢出(注意小端序) 所以 echo aaaaaaun | nc 220.249.52.133 52432 Finished
《从0到1:CTFer成长之路》书籍配套题目,来源网站:book.nu1l
64位,栈可执行保护
随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果 绕过保护,目前主要的是 ROP(Return Oriented Programming 返回导向编程)
其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。所谓 gadgets 就是以 ret 结尾的指令序列
通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程之所以称之为 ROP,是因为核心在于利用了指令集中的 ret 指令,改变了指令流的执行顺序。
ROP 攻击一般得满足如下条件
程序存在溢出,并且可以控制返回地址。可以找到满足条件的 gadgets 以及相应 gadgets 的地址。如果 gadgets 每次的地址是不固定的,那我们就需要想办法动态获取对应的地址了