记录一些工具的使用方法和遇到的问题解决途径
工具使用
one_gadget
github : https://github.com/david942j/one_gadget
所谓 one_gadget 就是一个实现了直接执行system(‘/bin/sh’)的程序跳板。
常见的,可以使用one_gadget覆盖劫持got表、返回地址、hook(__malloc_hook、__free_hook)等等操作,也就是当可以劫持控制流后覆盖的捷径
安装方法
安装one_gadget需要ruby环境,因为是由ruby写成的。
以ubuntu为例,首先安装ruby
1 | sudo apt-get install ruby |
还需要安装ruby的包管理器
1 | sudo apt-get install gem |
依赖安装好了以后就可以安装one_gadget了
1 | $ gem install one_gadget |
使用方法
一般针对libc使用,直接one_gadget libc.so就可以了
输出结果:
1 | └─[$] <> one_gadget libc64.so |
当泄露了libc基地址以后再用libc base+offset就可以使用了,但需要注意one_gadget的输出是有一定限制的,如[$rax = NULL],需要逐个尝试。
libc database
github: https://github.com/niklasb/libc-database
有一些PWN题故意不给libc文件,但是可以泄露地址,libc database可以利用泄露的地址来确定服务器使用的libc。
安装方法
先下载libc database
1 | git clone https://github.com/niklasb/libc-database |
利用get来下载流行的libc库
1 | cd libc-database |
程序会自动在ubuntu网站上下载相关的libc文件,存储到./db文件夹下

使用方法
使用./find可以在db中找到对应libc,如泄露的地址是printf 0xf7xxxx260 puts 0xf7xxxf30,输入最后三位即可
1 | $ ./find printf 260 puts f30 |
seccomp-tools
github: https://github.com/david942j/seccomp-tools
主要是针对linux seccomp沙箱规则的读取
安装方法
1 | gem install seccomp-tools |
如果遇到报错,可参考下面问题解决…
使用方法
主要就用dump了…
1 | seccomp-tools dump ./xxxx |
比如查看检查到的某通防机制

问题解决
ida “sp-analysis failed” 错误
问题描述
具体情况是在分析QWB CTF 2018 比赛中raisepig一题中,发现某些函数在按F5进行反编译时,出现这个问题,导致无法查看反编译代码。
参考了本队大佬的博客以后,解决了问题。
解决方法
问题原因貌似是在代码执行中的pop、push操作不匹配,导致ida解析的时候对esp的值产生错误造成的。这种不匹配可能对程序执行并无影响。
一种可能的解决办法是:
首先,在ida中打开栈指针的显示:options-general-stack pointer (勾选)

结果会在原来的地址偏移的旁边,显示函数栈内ESP寄存器的偏移:
可以看到在出现问题的函数中,retn前的偏移是一个非0值,这回导致ida识别函数出错,修改的目的就是使这个值为0,修改办法是使用“ALT + K”快捷键,强行使esp保持平衡,具体操作是:
在leave这一行(这很重要)按快捷键“ALT+K”,修改其值为leave前方标志的其ESP偏移值:

当发现,retn前标志的ESP偏移是00时,按F5应该就可以反编译了(不要care红色的报错,果断的按F5!)
gem “ERROR: Failed to build gem native extension.”问题
问题描述
在安装seccomp-tools时,使用
1 | gem install seccomp-tools |
命令时,出现报错
1 | ERROR: Error installing seccomp-tools: |
解决方法
缺少ruby-dev,执行
1 | sudo apt-get install ruby-dev |
不蒜子统计数目消失,只留下竖线
问题描述
10月9日,查看blog时,突然发现最下方统计数目消失,只剩下原本中间的细线了,最初以为是网络的问题,后来发下其他设备访问也同样是这样,访问一些相同主题的blog发现都消失。顺手将这个问题反馈到主题的issue,但是并没有解决。
解决方法
是在忍不了了,查看了一下文档,发现使用的默认统计插件是不蒜子 ,进入官网后突然发现公告:
1 | !!!!2018年9月 - 重要提示 !!!! |
也就是说问题原因是不蒜子的域名过期了。
这个问题就很好解决了,首先使用sublime等软件把主题的文件夹打开,全局搜素“dn-lbstatics.qbox.me”,把这个字符串换成“busuanzi.ibruce.info”,重新生成一下就可以了。
本blog使用的yelee主题默认字符串在1
2
3
4
5
6
## gdb调试内核时,报`Remote 'g' packet reply is too long`错误
### 问题描述
在remote模式调试x86-64的linux内核时,在每执行一步指令后都报错如下,尤其是在ni这样的指令都会中断
vmlinux: No such file or directory.
The target architecture is assumed to be i386:x86-64:intel
Remote debugging using localhost:4869
0xffffffff811dea46 in ?? ()
Continuing.
^CRemote ‘g’ packet reply is too long: 000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000703e8081ffffffff703e8081ffffffff0400000000000000c09b8581ffffffff60be030000c9ffff48b302008088ffff000000000000000000a98c81ffffffffa0108d81ffffffff000000000000000046ea1d81ffffffff4602000010000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f030000000000000000000000000000000000000000000000000000000000000004000000000000f0e4e00100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff00ffff72000810182028303840094800000000ffffffffffffffffffffffffffffffff04000000040000000400000004000000e0738d0000000000e0738d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000
1 |
|
修改源码/gdb/remote.c中的第8035行至8039行,将
1 | /* Further sanity checks, with knowledge of the architecture. */ |
注释掉,更改为
1 | if (buf_len > 2 * rsa->sizeof_g_packet) { |
注意,此处和网上其他修改有区别,其他版本修改的代码为
1 | if (buf_len > 2 * rsa->sizeof_g_packet) { |
但在8.2版本中regs这个成员定义有变化,参照后续的代码,可以修改正确。
之后执行
1 | make |
在运行~/gdb-8.2/bin/gdb时,加载pwndbg出错,提升
1 | python ImportError: No module named builtins |
解决方法是sudo pip install future
在更新pip以后,报错
1 | Traceback (most recent call last): File "/usr/bin/pip", line 9, |
解决方案是修改/usr/bin/pip文件为:
1 | #!/usr/bin/python |
解决了这一堆问题,这样就可以正常调试内核了。