在CTF中遇到的坑(持续更新)

工具篇

HackBar

HackBar工具通过php://input伪协议传递数据的时候,POST的数据如果不是参数名=参数值这样的形式(即如果没有等号它不会发送请求),在有些只传递参数值的情况下很坑。。以为是自己传递的数据的问题结果其实是工具根本没发出去。解决办法是换插件或者用burp改数据发送。还可以使用data:,abc 这样的形式给参数传递数据。

Apktool

apktool编译apk时,编译目录同级目录下需要有原apk文件否则编译报错

AndroidKiller

在编译apk的时候出现 libpng error: Not a PNG file 的错误
多半是图片格式识别问题,找到出问题的图片,查看他的真正图片格式改后缀即可

Jeb

jeb动态调试apk无法attach的问题
以管理员身份运行cmd或者powershell,在模拟器中安装好需要被调试的apk(有些模拟器不支持)

adb shell am start -D -n  com.example.findpass/.MainActivity

在cmd中运行上述指令,即可在jeb中attach上

VS2017

关闭不安全函数的警告。在项目属性中找到与编译器,在预编译定义中加上

_CRT_SECURE_NO_WARNINGS

Ubuntu

Could not get lock /var/lib/dpkg/lock-frontend – open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

ps afx|grep apt
sudo kill -9 2873
sudo rm /var/lib/dpkg/lock
sudo dpkg --configure -a
sudo apt update

bindiff

bindiff 4.3版本不支持IDA7.0,与IDA 6.8版本兼容性最好

Kali更新源报错

The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository

实际上是APT的GPG key过期了。解决办法

wget -q -O - https://archive.kali.org/archive-key.asc | apt-key add

Metasploit添加新exploit

除了要将脚本放在exploits文件夹下以外还需要重新加载所有模块

msf5 > reload_all 
或
msf5 > loadpath '/path'

from pwn import * 引入失败

在当前目录下不能有pwn.py pwn.pyc等同名文件

ida hex-rays decompiler插件偶尔会出差错

偶尔会反编译出差错,例如明明一个函数需要接受两个参数,反编译出来的函数调用却只传递一个参数。这种情况一般可以选择删除idb,重新载入F5一次。或者通过分析汇编指令,以汇编指令操作为准

pwntools recv获取不到数据(一直卡死)

可能是源程序出现了这种写法

printf("input:");
scanf("%s",s);

recvuntil("input:")

试着改成

printf("input:\n");
scanf("%s",s);

recvuntil("input:\n")

更多的情况是在出现以下写法的时候

printf("input:");
scanf("%s",s);

recvuntil("input:")

我们需要更改脚本为先输入再接收输出

f.sendline("abc")
f.recv()

从内存dump程序

dump出来的程序,文件偏移地址与相对虚拟地址(RVA)相等,不再需要公式转换

make: Warning: File ‘Makefile’ has modification time 50846 s in the future

find . -type f | xargs -n 5 touch
make clean
make 

make: warning: Clock skew detected. Your build may be incomplete.

虚拟机开启时间同步

启用Vim对系统剪贴板的支持

> vim --version | grep "clipboard"   查看是否支持(-clipboard不支持)
sudo apt-get install vim-gnome
vim ~/.vimrc

let mapleader="," 
vmap v "+gp  "粘贴并使光标移动到内容之后
vmap c "+y   "复制到系统剪贴板

gdb调试遇到下断点之后printf不输出内容

通过在main中添加

setbuf(stdout,NULL);

是因为默认输出流存在buffer机制,通过上面语句,取消buffer

Ubuntu中gdb attach进程 Operation not permitted.

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

python 安装扩展 error: Unable to find vcvarsall.bat

编辑 .\Python27\Lib\distutils\msvc9compiler.py
直接将 find_vcvarsall 函数的返回值硬编码为你机器上的 vcvarsall.bat 路径

gdb 单步调试结果没有单步

n/s都是C语言级的断点定位。 (比如没有加-g编译的代码,因为其没有C代码的行数标记,没办法定位)

ni/si都是汇编级别的断点定位。si会进入汇编和C函数内部,ni不会。
因此选择ni/si进行汇编级别的定位即可

error while loading shared libraries: libc++.so.1: cannot open shared object file: No such file or directory

sudo apt-get install libc++1

IDA 动态调试 process options 路径不能有空格

会出错的路径: D:\CTF\SUCTF2019\Akira Homework\
D:\CTF\SUCTF2019\AkiraHomework\

gdb 插件管理

无法同时使用 gdb-peda 和 pwndbg ,可以通过 ~/.gdbinit 来设置

# source ~/Documents/gdb_plugins/peda/peda.py
source ~/Documents/gdb_plugins/pwndbg/gdbinit.py

Manjaro 共享文件夹

vmware-hgfsclient
vmhgfs-fuse .host:/vm_shared /mnt/hgfs
su root
cd hgfs

Manjaro 设置代理

sudo vim ~/.bashrc

export http_proxy="http://localhost:port"
export https_proxy="http://localhost:port"
export socks5_proxy="http://localhost:port"

:wq

source ~/.bashrc

代理后 pip install 错误的情况

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f60339aea30>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/pip/

这种情况要加 –proxy 指定你系统配置好的代理下载

思路篇

能通过源程序计算出来的尽量通过源程序

比方说一道逆向题,可以将它的算法还原出来,自己编译出结果;也可以选择直接下断点,修改关键位置让源程序计算出结果。尽量选择后者,因为自己还原算法的时候很有可能遗漏关键的地方,比如说key是会变化的,但是还原的时候却把它直接复制出来了,认为它不会变化

LinuxC和WindowsC的差异

比如同一个随机数种子,rand函数产生的伪随机值在两个操作系统上不同的编译器产生的程序的结果是不一样的,并且不同版本的编译器也有可能不一样。具体可能取决于RAND_MAX

算法爆破速度过慢

有的时候原程序可能使用Java等语言编写,由于算法时间复杂度比较大,爆破速度很慢,这种时候可以选择放弃爆破转而逆向算法来应对。也可以选择移植算法到C/C++上并开启gcc的最大优化来提高爆破速度

gcc -o bruteforce -O3 bruteforce.c

暴力破解要注意的地方

即生成的待检验数据集合是否有效,是否全面

脱壳思路

先查壳,例如UPX尽量用UPX.exe本身去脱壳。若发现无法直接用UPX.exe脱壳,先考虑修复UPX Header区块名,再采用UPX.exe脱壳。

若无法使用原加壳软件脱壳,再来考虑手动脱壳。

Be the first to reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注

5 × 5 =