由于pwn题中经常会遇到glibc版本与本地环境不一致,需要patch的问题,遇到流行的版本,本地有对应的文件的情况还比较方便,但是一旦遇到小众版本,尤其是清华镜像站或者glibc-all-in-one找不到的版本时,patch就成了一大问题。同时,下载的glibc如果不包含调试信息,在某些手法的学习或者利用过程中会很不舒服。而且patch题目文件,修改exp对应的文件地址是每次上手pwn题之前必不可少的步骤,因此结合pwninit的功能,利用python实现了一个脚本,可以自动解决这些问题,并在此基础上,提供调试时显示glibc源码的功能,原理参考gdb文档。本文将简要介绍脚本的功能及用法。
项目地址:cpwn。
安装步骤在项目首页已经作了详细介绍,不再赘述,此处主要通过图文的方式展示实现的功能效果。
在https://launchpad.net/ubuntu/+source/glibc/ 上列举了Ubuntu LTS发行版使用的glibc,使用cpwn fetch
命令会自动下载这些glibc版本在amd64和i386架构的libc,debug-symbol,source。
在目录下运行cpnw init
,如果当前目录不存在glibc则会提示用户选择cpwn包含的glibc版本:
如果目录下存在glibc,但是cpwn没有下载过这个版本的glibc,则会向远程拉取对应版本的glibc:
确定好版本之后会将pwn
文件patch,生成pwn_patched
,注意被patch的文件必须是没有使用[--set-rpath RPATH]
选项patch过的文件:
并根据对应的glibc版本生成初始化的exp:
在当前目录下运行python ./exp.py GDB
可以弹出gdb调试界面,并显示调试符号:
源码:
配置文件默认保存在~/.config/cpwn
,对应的目录树为:
需要修改模板时可以直接编辑此处的template.py
或者修改配置文件中的template
的路径:
其他配置项也可以按需修改,如果网络情况不好,或者无需下载调试符号,源码,可以修改archs
和pkgs
,仅仅下载amd64
的libc6
。
$ ldd .
/pwn_patched
linux-vdso.so.1 (0x00007ffe238a2000)
/home/geekcmore/
.config
/cpwn/pkgs/2
.35-0ubuntu3.7
/amd64/libc6_2
.35-0ubuntu3.7_amd64
/lib/x86_64-linux-gnu/libc
.so.6 (0x00007fddbd1c4000)
/home/geekcmore/
.config
/cpwn/pkgs/2
.35-0ubuntu3.7
/amd64/libc6_2
.35-0ubuntu3.7_amd64
/lib/x86_64-linux-gnu/ld-linux-x86-64
.so.2 =>
/lib64/ld-linux-x86-64
.so.2 (0x00007fddbd3f9000)
$ ldd .
/pwn_patched
linux-vdso.so.1 (0x00007ffe238a2000)
/home/geekcmore/
.config
/cpwn/pkgs/2
.35-0ubuntu3.7
/amd64/libc6_2
.35-0ubuntu3.7_amd64
/lib/x86_64-linux-gnu/libc
.so.6 (0x00007fddbd1c4000)
/home/geekcmore/
.config
/cpwn/pkgs/2
.35-0ubuntu3.7
/amd64/libc6_2
.35-0ubuntu3.7_amd64
/lib/x86_64-linux-gnu/ld-linux-x86-64
.so.2 =>
/lib64/ld-linux-x86-64
.so.2 (0x00007fddbd3f9000)
from
pwn
import
*
filename
=
"pwn_patched"
libcname
=
"/home/geekcmore/.config/cpwn/pkgs/2.35-0ubuntu3.8/libc6_2.35-0ubuntu3.8_amd64/lib/x86_64-linux-gnu/libc.so.6"
host
=
"127.0.0.1"
port
=
1337
elf
=
context.binary
=
ELF(filename)
context.terminal
=
[
'tmux'
,
'neww'
]
if
libcname:
libc
=
ELF(libcname)
gs
=
def
start():
if
args.GDB:
return
gdb.debug(elf.path, gdbscript
=
gs)
elif
args.REMOTE:
return
remote(host, port)
else
:
return
process(elf.path)
p
=
start()
p.interactive()
from
pwn
import
*
filename
=
"pwn_patched"
libcname
=
"/home/geekcmore/.config/cpwn/pkgs/2.35-0ubuntu3.8/libc6_2.35-0ubuntu3.8_amd64/lib/x86_64-linux-gnu/libc.so.6"
host
=
"127.0.0.1"
port
=
1337
elf
=
context.binary
=
ELF(filename)
context.terminal
=
[
'tmux'
,
'neww'
]
if
libcname:
libc
=
ELF(libcname)
gs
=
def
start():
if
args.GDB:
return
gdb.debug(elf.path, gdbscript
=
gs)
elif
args.REMOTE:
return
remote(host, port)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2024-8-31 13:48
被GeekCmore编辑
,原因: 未选择主题