0ctf 2017 babyheap writeup 有关 fastbin attack 利用
稍微复习一下 fastbin attack 利用思路:
覆盖 got 表劫持控制流 覆盖栈上函数返回地址,然后ROP劫持控制流 覆盖 malloc_hook、覆盖 _IO_FILE 等方式劫持控制流 没有开 FULL RELRO 的话,就可以考虑修改 got 表内容 算是很经典的一道题了吧 先分析一下程序 allocate:
最大0x1000
fill 关键!
没有设置字符串结尾,而且长度并不是之前 chunk 分配时指定的长度,是自己指定的,所以这里就出现了任意堆溢出的情形。可以用来泄露libc地址,以及构造fake chunk
dump
输出对应chunk的内容
free
释放堆块,清空 inuse,size,ptr
chunk 结构:
+---------|---------+
|prev_size| size |
|---------|---------|
| fd | bk |
|---------|---------|
| data |
+---------|---------+
chunk 包含三个字段:
inuse
size
ptr
题目中 fill 存在堆溢出,可以写任意长度,注意分配使用的 calloc ,在分配的时候会将分配出来的 chunk 先清空,dump 的大小是根据 alloc 指定的 size 决定的,跟真正的 chunk 大小无关。...
SROP(Sigreturn Oriented Programming)
SROP signal 机制 32 位的 sigreturn 的调用号为 77,64 位的系统调用号为 15
过程: 推荐看 angelboy 的 ppt
x86
mov eax,0x77
int 0x80
x64
mov rax,0xf
syscall
利用要点 利用 sigreturn ,构造 syscall 控制所有寄存器 控制 ip 和 stack 需要足够的栈空间保存 signal frame 直接伪造 sigcontext 结构,全部 push 进 stack 将 ret address 设在 sigreturn syscall 的 gadget 将 signal frame 中的 rip(eip) 设在 syscall sigreturn 回来后就会执行我们自己构造的 syscall 要求 利用栈溢出控制栈内容 相应的地址 ‘/bin/sh’ signal frame syscall sigreturn 系统调用链 控制栈指针 rsp 把原来 rip 指向的 syscall gadget 换成 syscall;ret gadget 基本思路:首先构造一个 fake signal frame 写入内存中,将然后将 RSP 指向这段空间,再发送 rt_sigreturn 信号( 利用 eax 和 syscall 调用 sigreturn 控制 rax=15 32位是 0x77)。此时,内核会将构造好的 fake signal frame 取出,恢复。恢复后类似于ROP的方式,为 syscall 调用 execve...
关于 android 基本 UI 界面设计的常用空间等内容
记得修改 build.gradle 文件 android 应用中的所有用户界面元素都是使用 View 和 ViewGroup 对象构建而成。 打开 res/layout/*.xml 进行布局,首先看到图形显示界面为空白。
修改 res/value/styles.xml stackoverflow
UI 设计 ConstraintLayout 约束布局 形式:app:layout_constraint[组件本身的位置]_to[目标位置]Of="[目标id]"
1:设计和蓝图:选择您想如何在编辑器中查看您的布局。设计视图显示一个颜色预览你的布局,而蓝图视图显示只对每个视图轮廓。或者你可以查看设计+并排蓝图. 提示:您可以按下B就这些视图之间切换。
shape 自定义圆角按钮
事件处理 Intent、Bundle 的使用以及 RecyclerView、ListView 的应用 Intent mIntent = new Intent(this,SerializableDemo.class); Bundle mBundle = new Bundle(); mBundle.putSerializable("data",object); mIntent.putExtras(mBundle); startActivity(mIntent); 取值
Bundle bundle = this.getIntent().getExtras(); broadcast 静态广播 动态广播 发送广播:将数据装入一个Intent对象,调用Context.sendBroadcast() 方法发出去。 接受广播:所有已经注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则就会调用 BroadcastReceiver 的 void onReceive(Context curContext, Intent broadcastMsg)...