问题解决及工具使用

记录一些工具的使用方法和遇到的问题解决途径

工具使用

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
└─[$] <> one_gadget libc64.so 
0x45216 execve("/bin/sh", rsp+0x30, environ)
constraints:
rax == NULL

0x4526a execve("/bin/sh", rsp+0x30, environ)
constraints:
[rsp+0x30] == NULL

0xf02a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL

0xf1147 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL

当泄露了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
2
cd libc-database
./get

程序会自动在ubuntu网站上下载相关的libc文件,存储到./db文件夹下

使用方法

使用./find可以在db中找到对应libc,如泄露的地址是printf 0xf7xxxx260 puts 0xf7xxxf30,输入最后三位即可

1
2
$ ./find printf 260 puts f30
archive-glibc (id libc6_2.19-10ubuntu2_i386)

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
2
3
4
5
6
7
  ERROR:  Error installing seccomp-tools:  
ERROR: Failed to build gem native extension.

/System/Library/Frameworks/Ruby.framework/Versions/2.1/usr/bin/ruby
extconf.rb
mkmf.rb can't find header files for ruby at
/System/Library/Frameworks/Ruby.framework/Versions/2.1/usr/lib/ruby/ruby.h

解决方法

缺少ruby-dev,执行

1
sudo apt-get  install   ruby-dev

不蒜子统计数目消失,只留下竖线

问题描述

10月9日,查看blog时,突然发现最下方统计数目消失,只剩下原本中间的细线了,最初以为是网络的问题,后来发下其他设备访问也同样是这样,访问一些相同主题的blog发现都消失。顺手将这个问题反馈到主题的issue,但是并没有解决。

解决方法

是在忍不了了,查看了一下文档,发现使用的默认统计插件是不蒜子 ,进入官网后突然发现公告:

1
2
3
4
5
6
7
!!!!2018年9月 - 重要提示 !!!!
大家好,因七牛强制过期原有的『dn-lbstatics.qbox.me』域名(预计2018年10月初),与客服沟通数次无果,即使我提出为此付费也不行,只能更换域名到『busuanzi.ibruce.info』!因我是最早的一批七牛用户,为七牛至少带来了数百个邀请用户,很痛心,很无奈!
各位继续使用不蒜子提供的服务,只需把原有的:
<script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>
域名改一下即可:
<script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
只需要修改该js域名,其他均未改变。若有疑问,可以加入不蒜子交流QQ群:`419260983`,对您带来的不便,非常抱歉!!!还是那句话,不蒜子不会中断服务!!!!

也就是说问题原因是不蒜子的域名过期了。

这个问题就很好解决了,首先使用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

### 问题解决

问题原因是gdb在处理数据时,接受数据超长就会以error结束。

可以通过patch gdb源码解决。

首先下载一个新的gdb,下载地址`ftp://ftp.gnu.org/gnu/gdb`

然后解压编译:

```bash
tar xf gdb-8.2.tar.xz
cd gdb-8.2
mkdir ~/gdb-8.2 # 安装目录
./configure --prefix=<你的install绝对路径>

修改源码/gdb/remote.c中的第8035行至8039行,将

1
2
3
4
/* Further sanity checks, with knowledge of the architecture.  */
if (buf_len > 2 * rsa->sizeof_g_packet)
error (_("Remote 'g' packet reply is too long (expected %ld bytes, got %d "
"bytes): %s"), rsa->sizeof_g_packet, buf_len / 2, rs->buf);

注释掉,更改为

1
2
3
4
5
6
7
8
9
10
11
if (buf_len > 2 * rsa->sizeof_g_packet) {
rsa->sizeof_g_packet = buf_len ;
for (i = 0; i < gdbarch_num_regs (gdbarch); i++) {
if (rsa->regs[i].pnum == -1)
continue;
if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet = 0;
else
rsa->regs[i].in_g_packet = 1;
}
}

注意,此处和网上其他修改有区别,其他版本修改的代码为

1
2
3
4
5
6
7
8
9
10
11
if (buf_len > 2 * rsa->sizeof_g_packet) {
rsa->sizeof_g_packet = buf_len ;
for (i = 0; i < gdbarch_num_regs (gdbarch); i++) {
if (rsa->regs->pnum == -1)
continue;
if (rsa->regs->offset >= rsa->sizeof_g_packet)
rsa->regs->in_g_packet = 0;
else
rsa->regs->in_g_packet = 1;
}
}

但在8.2版本中regs这个成员定义有变化,参照后续的代码,可以修改正确。

之后执行

1
2
make 
make install

在运行~/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
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python
# GENERATED BY DEBIAN

import sys

# Run the main entry point, similarly to how setuptools does it, but because
# we didn't install the actual entry point from setup.py, don't use the
# pkg_resources API.
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())

解决了这一堆问题,这样就可以正常调试内核了。

文章目录
  1. 1. 工具使用
    1. 1.1. one_gadget
      1. 1.1.1. 安装方法
      2. 1.1.2. 使用方法
    2. 1.2. libc database
      1. 1.2.1. 安装方法
      2. 1.2.2. 使用方法
    3. 1.3. seccomp-tools
      1. 1.3.1. 安装方法
      2. 1.3.2. 使用方法
  2. 2. 问题解决
    1. 2.1. ida “sp-analysis failed” 错误
      1. 2.1.1. 问题描述
      2. 2.1.2. 解决方法
    2. 2.2. gem “ERROR: Failed to build gem native extension.”问题
      1. 2.2.1. 问题描述
      2. 2.2.2. 解决方法
    3. 2.3. 不蒜子统计数目消失,只留下竖线
      1. 2.3.1. 问题描述
      2. 2.3.2. 解决方法
|