解题过程:
看反汇编代码 看出该程序 是个笔记程序
有添加,编辑,显示单个笔记,显示全部笔记 四个选择
一开始我是想找溢出点,盯着add_note 想到创建很多个note 可以导致溢出
随后过程中有两种想法,但是都不行
1.使用ret2dl_resolve 的方法,但是发现单靠add_note 只能控制栈上一处空间的内容
使用add_note 在内存中的存储形式是
node->next(4字节
node->data(n字节
node->next 在创建过程中是自动赋值的,仅靠add_note 是无法控制这个值得
所以即使能溢出 控制了ret 也无法控制其它栈空间,也就无法调用fgets函数了
2.泄露libc地址
在发现只能控制ret 得时候这个想法也泡汤了…
随后去参考大佬的wp
发现漏洞点找错了,漏洞点发生在edit_note 函数中…
正确思路:
由于各个note之间是相邻的,在创建一个note后,只要这个note的data不长,就可以通过重新编辑这个note,用其它数据填充原先的data,用准备好的指针覆盖下一个note的node->next值,然后再通过编辑第三个note达到任意地址写的目的
例如:
第一个note:
node->next(指向第二个note)
node->data(“hahaha”)
在编辑第一个note的时候 只要发送 ‘a’*8 + p32(addr) 就可以覆盖第二个note的node->next 值,
控制了第二个note的node->next值 ,可以在通过编辑第三个note达到任意地址写的目的
漏洞利用方法:
使用ret2dl_resolve劫持重定位从而调用system函数获取shell
编写exp时学到的知识点:
- 字节流类似于"\x76\x73\xee\xff" 转化为整数可以使用python中的struct模块
“<” 指小端序
”I" 指无符号整数
例如:
2.关于roptuils工具再复习一遍
rop.call()
调用某个函数,后接该函数的返回地址
rop.dl_resolve_call()
接收两个参数,第一个参数时伪造的.rel.plt 表项的bss段地址,
第二个参数是system函数的参数 “/bin/sh” 的地址
这个函数返回值包含了plt[0], 伪造Elf32_Rel 表项的bss段地址距JMPREL 的偏移, system的返回地址, ”bin/sh“ 的地址
rop.dl_resolve_data()
接收两个参数
第一个参数是伪造Elf32_Rel 表项的bss段开始的地址
第二个参数是要调用的函数的名称,这里就是’system’