0%

修正

发现makefile存在问题,仅会编译比main.cpp更新的依赖文件,导致每次都要make两次才能正常调试。已修改$?$^

$@ –代表目标文件(target)
$^ –代表所有的依赖文件(components)
$< –代表第一个依赖文件(components中最左边的那个)
$? –代表比目标还要新的依赖文件列表

概述

之前从知乎抄的配置只能编译单文件源文件,编译多文件的话需要手动修改g++编译参数(不能忍啊→_→),于是搜索之,找到解决方案。
关键词:makefile

环境准备

原本使用VSCode就可以正常进行编译调试等操作。
已安装make工具并添加到环境变量,我自己用的是mingw32-make
(也可使用msys提供的工具包,度盘链接: https://pan.baidu.com/s/1zJBcS6tjfXlwg1kP6VnLSg 提取码: f9ya)

具体方案

构建makefile模板

我基本是直接复制参考博文里的模板(修改标准库为17),内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# originating https://github.com/TheNetAdmin/Makefile-Templates
# tool marcros
CC := g++
CCFLAG := -std=c++17
DBGFLAG := -g
CCOBJFLAG := $(CCFLAG) -c

# path marcros
BIN_PATH := bin
OBJ_PATH := obj
SRC_PATH := src
DBG_PATH := debug

# compile marcros
TARGET_NAME := main
ifeq ($(OS),Windows_NT)
TARGET_NAME := $(addsuffix .exe,$(TARGET_NAME))
endif
TARGET := $(BIN_PATH)/$(TARGET_NAME)
TARGET_DEBUG := $(DBG_PATH)/$(TARGET_NAME)
MAIN_SRC := src/main.cpp

# src files & obj files
SRC := $(foreach x, $(SRC_PATH), $(wildcard $(addprefix $(x)/*,.c*)))
OBJ := $(addprefix $(OBJ_PATH)/, $(addsuffix .o, $(notdir $(basename $(SRC)))))
OBJ_DEBUG := $(addprefix $(DBG_PATH)/, $(addsuffix .o, $(notdir $(basename $(SRC)))))

# clean files list
DISTCLEAN_LIST := $(OBJ) \
$(OBJ_DEBUG)
CLEAN_LIST := $(TARGET) \
$(TARGET_DEBUG) \
$(DISTCLEAN_LIST)

# default rule
default: all

# non-phony targets
$(TARGET): $(OBJ)
$(CC) $(CCFLAG) -o $@ $^

$(OBJ_PATH)/%.o: $(SRC_PATH)/%.c*
$(CC) $(CCOBJFLAG) -o $@ $<

$(DBG_PATH)/%.o: $(SRC_PATH)/%.c*
$(CC) $(CCOBJFLAG) $(DBGFLAG) -o $@ $<

$(TARGET_DEBUG): $(OBJ_DEBUG)
$(CC) $(CCFLAG) $(DBGFLAG) $^ -o $@

# phony rules
.PHONY: all
all: $(TARGET)

.PHONY: debug
debug: $(TARGET_DEBUG)

.PHONY: clean
clean:
@echo CLEAN $(CLEAN_LIST)
@rm -f $(CLEAN_LIST)

.PHONY: distclean
distclean:
@echo CLEAN $(CLEAN_LIST)
@rm -f $(DISTCLEAN_LIST)

目录结构

src文件夹下放源文件以及头文件,后面还要需要修改.vscode中的task.jsonlaunch.json
注意:如果使用本文中的makefle,包含主函数的源文件名必须为main.cpp

task.json

如果你使用的是msys的工具包,那command就写make
按快捷键Ctrl+Shift+B可以执行仅生成命令(build)
(在微软输入法中文模式时会出现表情窗口←_←)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "mingw32-make",
"args": [
"default"
],
"type": "shell",
"group": {
"kind": "build",
"isDefault": true
},
},
{
"label": "build-debug",
"command": "mingw32-make",
"args": [
"debug"
],
"type": "shell"
},
{
"label": "clean",
"command": "mingw32-make",
"args": [
"clean"
],
"type": "shell"
}
]
}

launch.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

// https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/debug/main.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/debug/",
"environment": [],
"externalConsole": true,
"internalConsoleOptions": "neverOpen",
"MIMode": "gdb",
"miDebuggerPath": "gdb.exe", // 调试器路径,Windows下后缀不能省略,Linux下则去掉
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false,
}
],
"preLaunchTask": "build-debug" // 调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应
}
]
}

配置完成

enjoy it!
😉

参考

VS Code 配置 C/C++ 环境

Reverse EasyCpp

[2019/10/25更新]
首先读入16个数字,然后生成一个斐波那契数组,长度也为16
然后对输入数组进行操作,从第二位开始,都加上第一位的值(transform
动态调试可知accumulate的匿名函数对运算完的数组做反转操作
然后与斐波那契数组比较,相同则输出flag
也就是说输入的第一个数字是不会变的,所以就是987
后面的数字直接脚本跑一下就可以得到结果了

阅读全文 »

准备条件

(设备已解锁BL,电脑fastboot环境正常是前提条件)
已下载magisk框架rec安装包(github下载),有sd卡(adb sideload未测试是否可安装,建议用内存卡),并已安装第三方recovery(以下简称rec)

已安装magisk框架app,且有原厂recovery_ramdisk镜像

安装方式

fastboot刷入命令(华为没有boot分区,所以rec也是通过这个指令刷入)
(BOOT.img请自行替换为对应镜像名)

1
fastboot flash recovery_ramdisk BOOT.img

rec安装法

启动至第三方rec,从sd卡选择magisk卡刷包,安装。
安装完成后选择重启到rec模式,即可进入带面具的系统

修补镜像直接刷入法

参考【荣耀v10】EMui9.0.0.181刷magisk框架及root教程,个人未测试,应该可行
提取出原厂recovery_ramdisk镜像(从官方线刷包或其他地方获得),并发送到手机(模拟器应该也行)
使用magisk框架app,选择安装,修补boot镜像,选择提取出的原厂镜像
修补完成后传回电脑,手机进入fastboot模式,刷入即可

启动方式

由于修补的镜像其实是rec分区,所以要按照进入rec的方式进入带面具的系统。
(个人测试,在带magisk的系统下重启仍然是有root的,等价于启动到rec)
具体操作如图(图源自参考帖)

注意

如果安装了不适配的模块,还是需要刷入第三方rec,进入后删除/data/adb文件夹,然后即可正常开机(magisk要重刷)。

参考

【荣耀v10】EMui9.0.0.181刷magisk框架及root教程

问题

代码在8.0以下系统可正常创建悬浮窗,8.0以上则创建不了。原因是悬浮窗样式需要重新设置。

解决方案

增加SDK判断代码

1
2
3
4
5
6
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
wmParams.type = LayoutParams.TYPE_APPLICATION_OVERLAY;
}
else{
wmParams.type = LayoutParams.TYPE_PHONE;
}

判断是否拥有悬浮窗权限并申请

安卓6.0(代号M,SDK 23)之后,需要动态申请权限,悬浮窗权限也不例外。所以可以在添加以下代码来申请悬浮窗权限。
PS:当然,必须在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

1
2
3
4
5
6
7
8
if (Build.VERSION.SDK_INT >= 23)
{
if (!Settings.canDrawOverlays(activity))
{
Intent it = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
activity.startActivityForResult(it, 1);
}
}
1
2
3
4
5
6
7
8
9
10
11
@TargetApi(23) protected void onActivityResult(int reqCode, int resCode, Intent data)
{
if (!Settings.canDrawOverlays(this))
{
Toast.makeText(this, "未授予悬浮窗权限!", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(this, "悬浮窗权限授予成功!", Toast.LENGTH_SHORT).show();
}
}

关于0x01010540错误

0x01010540是因为SDK版本太高,反编译工具识别不出来,需要替换成0x0101048f
具体方法见后文

关于0x01010543错误

如果只有

1
Exception in thread "main" b.a.a.e: resource spec: 0x01010543

没有UndefinedResObject
则更换apktool后再试
apktool可以在爱盘下载

实在要修复的话,往下看:(都是修改resources.arsc

修复UndefinedResObject错误

报错信息:

1
Exception in thread "main" brut.androlib.err.UndefinedResObject: resource spec: 0x7f000006

解决方法

aapt dump查看apk的资源信息,并保存到文件

1
aapt d --values resources test.apk >1.txt

找到DataType数据类型不正确的值(搜索attribute即可)对应的描述符(一般是把7f改成00,0x00000006
文件中没有识别出正确的数据类型,显示的是(attribute) 0x00000006
使用010Editor,Ctrl+F,字节形式搜索对应描述的16进制数的小端字节(就是00000006写成06000000
然后把它前面的字节0x02修改为0x03,保存后替换进apk即可

修复resource spec: 0x01010543

报错信息:

1
Exception in thread "main" b.a.a.e: resource spec: 0x01010543

解决方法

使用010Editor,Ctrl+F,字节形式搜索报错的16进制数的小端字节(就是12345678写成78564312
这里我们搜索43050101,然后把它前面的字节0x02修改为0x03,保存后替换进apk即可

修复resource spec: 0x01010540

0x01010540是因为SDK版本太高,反编译工具识别不出来,需要替换成0x0101048f

解决方法

使用010Editor,Ctrl+F,字节形式搜索报错的16进制数的小端字节(就是40050101换成8f040101

参考

记录Android Killer反编译时遇到的异常
保护Android resources文件不被反编译原理分析

解题方法并不唯一,仅供参考。

题目打包下载地址

https://down.52pojie.cn/Challenge/Happy_New_Year_2019_Challenge.rar

第一题 签到题

关注“吾爱破解论坛”公众号,回复指定字符串即可获得本题正确口令和第二题题目下载地址。

第二题 CrackMe

(本题我做的时候是无壳的,因为碰巧发现了内测时的题。公测时加了个upx的壳,故需要先脱壳,esp定律即可)
(这题用OD其实更方便些,个人习惯用IDA)
脱壳后IDA打开,Shift+F12查看字符串,找到关键字符串正确!!!回复你输入的内容到吾爱破解论坛公众号
按X查看引用,定位到判断代码

按F5查看伪代码

上面有个长度判断,输入字符串长度为16
然后下面有个strcmp判断,相等则返回0,不过加了个!就变成相等返回真了

所以在strcmp下个断点查看寄存器(v2)即可得到密码

阅读全文 »

第一步,分区

Linux只有分区挂载目录的概念,所以需要在Windows下分出一块较大的未分配空间,不需要格式化

下载镜像并写入U盘

下载完镜像以后,使用软碟通将镜像写入U盘,然后重启。
PS: 如果U盘本身就支持efi启动的话,可以直接把镜像解压到U盘
开机后把握时机进入Boot Menu,选择从USB启动。
注意:需要在BIOS中关闭安全启动(Secure Boot)

阅读全文 »

概述

选定代码段后,按P创建函数,无法F5,提示call analysis failed

原因

1、IDA无法识别出正确的调用约定(calling convention);
2、IDA无法识别出正确的参数个数。

解决方案

方法1 - IDA自动分析

定位到报错的代码位置,双击调用的函数,进入后按一次F5,再返回就可以F5了。

方法2 - 修改参数个数

定位到报错的代码位置,鼠标点击调用的函数,按下Y键,修改参数个数。
比如将(_JNIEnv *, int, int, int, int, int, int, int);改为(_JNIEnv *, int, int, int);

具体参数个数,需要根据函数调用约定及汇编代码确定(看它传入了几个参数)。

参考

IDA sp-analysis failed 不能F5的 解决方案之(二)
解决IDA出现Decompilation failure: call analysis failed不可以F5的问题
IDA反编译失败-call analysis failed

概述

笔记本装了win10+Ubuntu18.04双系统,但是两个系统的时间并不同步,相差8小时(正好是时区数)。于是搜索之,找到解决方案

原因

Windows 与 Mac/Linux 看待系统硬件时间(Hardware Ttime,或称实时时间,即RTC,Real_Time Clock)的方式不同。
Windows把计算机硬件时间当作本地时间(local time),所以在Windows系统中显示的时间跟BIOS中显示的时间是一样的。
而Linux/Unix/Mac把计算机硬件时间当作UTC(Universal Time Coordinated,世界统一时间), 所以在Linux/Unix/Mac系统启动后在该时间的基础上,加上电脑设置的时区数。

解决方案

所以只需要使两个系统对待硬件时间的方式一致即可。
自然,有两种方法。

方法1 修改Linux系统

打开终端,执行
timedatectl set-local-rtc 1
禁用Linux系统的UTC时间,重启即可生效(不需要管理员权限)

提示: 在 Ubuntu 16.04 版本以前,关闭UTC的方法是编辑/etc/default/rcS,将UTC=yes改成UTC=no, 但在Ubuntu 16.04使用systemd启动之后,时间改成了由timedatectl来管理

如果时间还是不对,就先在设置里修改系统时间为当前时间(北京时间),然后执行
timedatectl set-local-rtc 1

sudo hwclock -w
写入当前时间到硬件

方法2 修改Windows系统(不建议)

Win+X,打开Powershell(管理员),执行
Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1
解释:设置RealTimeIsUniversal键值为1,也就是把RTC当作UTC
然而我用这种方法,切换几次系统以后时间往后推了16小时= =
所以个人不推荐使用这种方法

参考

解决Windows10与Ubuntu16.04双系统时间不一样问题!

来自中老年的表情包

图片如下(可以自己尝试分析)

分析

只有一个gif,惯例010Editor打开,文件尾有个压缩包
提取之,不出意外的有密码,而且并不是伪加密

尝试

输入新年快乐,密码错误
输入happy,密码错误
输入happy2019,密码错误
难道隐藏在图片里?于是PS提取之,得到6张png
一番尝试后没有任何收获(陷入僵局.jpg
甚至怀疑是否在网页中含有密码,询问作者,得到回复:

暴力出奇迹

得到最终的神秘数字

然后,爆破得到了密码,89ms= =
解压后得到一个wav文件,播放,发现是电话拨号音
使用AU打开并显示频谱(Shift+D),对照DTMF表得到对应数字

DTMF对照表

低频 \ 高频(Hz) 1209 1336 1477 1633
697 1 2 3 A
770 4 5 6 B
852 7 8 9 C
941 * 0 # D

—-华丽(并不)的分割线—-

最后祝大家新年快乐!