0%

题目

两个足够聪明的人玩轮流取石头的游戏,谁取到最后一个石头谁就赢了,他们一次只能取1个、3个、7个或8个石头,写一程序判断n个石头时先取的人是输还是赢。

输入格式:

一个整数n,其值不超过10000000。

输出格式:

如果先取的人赢,请以单独一行输出1,否则输出0。

输入样例:

这里是3组输入。

1
2
3
1
10
300

输出样例:

1
2
3
1
1
0
阅读全文 »

概述

使用HTTPS协议时需要输入账号密码,比较麻烦,虽然可以配置自动保存密码,但明文保存可能导致安全性的降低。
在部署博客时也收到了github的邮件提醒:

On July 1st, 2020, basic authentication using password to this endpoint will no longer work

故决定使用ssh密钥连接git

步骤

安装git bash

https://gitforwindows.org/

初始化

打开git bash,配置用户名和邮箱:

1
2
git config --global user.name author
git config --global user.email [email protected]

生成ssh key

1
ssh-keygen -t rsa -C "[email protected]"

回车设置为默认路径,然后输入两次密码(直接回车则密码为空)

在github中添加ssh key

打开https://github.com/settings/keys
id_rsa.pub内容填入即可

测试

执行

1
ssh -T [email protected]

输入密码验证,返回正确则说明配置完成。

建议

之后都使用git协议来克隆仓库
如:

1
git clone [email protected]:XhyEax/LeetCode.git

参考

vscode中利用git通过ssh连接github
git-ssh-config.md

步骤

在终端中执行

1
git config --global credential.helper store

然后重新打开VSCode

注意

这样配置的话,会在用户目录下生成.git-credentials文件,明文保存账号密码。
PS: 用户目录(Windows: C:/User/UserName,Linux: ~

关闭

编辑.gitconfig,删除以下内容

1
2
[credential]
helper = store

参考

vscode git提交总让输入用户名及密码

更新

caddy2配置反向代理

步骤

解析域名

申请SSL证书前,请务必提前解析好域名记录(解析后最好等一会,以全球生效)

申请证书

此处可使用Caddy自动申请的Let's Encrypt证书,个人使用的是CloudFlare的免费证书

编辑CaddyFile

使用其他证书

1
2
3
4
5
https://bd.xxx.com {
gzip
tls /root/xxx.crt /root/xxx.key
proxy / https://www.baidu.com
}

使用自动申请的证书

把tls选项改为邮箱(似乎不加也行):

1
2
3
4
5
https://bd.xxx.com {
gzip
tls [email protected]
proxy / https://www.baidu.com
}

重启Caddy

1
service caddy restart

参考

利用 Caddy 轻松实现反向代理/镜像(支持自签SSL证书)

准备工作

python环境(已安装requests)

步骤

获取源地址

首先F12-Network,然后刷新一下页面。获取到当前文档页面的源地址,类似于
http://ebooks.crup.com.cn/t/xxxxx_output/web/xxxxx_opf_files/xxxxxxxxxxxxxxxxxxxx_1.swf
下划线后的数字对应页码。

安装程序包

需要安装requests用于请求文件,安装pillow用于合并pdf:

1
pip install requests pillow
阅读全文 »

报错原因

1.java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定的目录中寻找的。
2.忽略了package的影响。加载一个类,是需要完整的类名,所以必须要把包名带上

解决方案

指定生成class文件的文件夹为classpath,执行java指令,例如:

1
java -classpath "D:\source\Java\Painter\bin" app.OpenGLApp

参考

控制台中运行java类提示”找不到或无法加载主类”错误的原因及解决方案

代码如下

(非递减排序)

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
sort:addi $sp,$sp,-20
sw $ra,16($sp)
sw $s3,12($sp)
sw $s2,8($sp)
sw $s1,4($sp)
sw $s0,0($sp)
move $s2,$a0
move $s3,$a1
move $s0,$zero
for1tst:slt $t0,$s0,$s3
beq $t0,$zero,exit1
addi $s1,$s0,-1
for2tst:slti $t0,$s1,0
bne $t0,$zero,exit2
sll $t1,$s1,2
add $t2,$s2,$t1
lw $t3,0($t2)
lw $t4,4($t2)
slt $t0,$t4,$t3
beq $t0,$zero,exit2
move $a0,$s2
move $a1,$s1
jal swap
addi $s1,$s1,-1
j for2tst
exit2:addi $s0,$s0,1
j for1tst
exit1:lw $s0,0($sp)
lw $s1,4($sp)
lw $s2,8($sp)
lw $s3,12($sp)
lw $ra,16($sp)
addi $sp,$sp,20
jr $ra
swap: sll $t1,$a1,2
add $t1,$a0,$t1
lw $t0,0($t1)
lw $t2,4($t1)
sw $t2,0($t1)
sw $t0,4($t1)
jr $ra

参考

计算机组成原理与设计(第五版) 机械工业出版社 第94页

步骤

查询当前内存

1
free -h

创建交换文件

1
2
touch /root/swapfile
dd if=/dev/zero of=/root/swapfile bs=1M count=4096

格式化交换文件

1
mkswap /root/swapfile

启用交换文件

1
swapon /root/swapfile

配置开机自动加载

/etc/fstab文件中添加:

1
/root/swapfile swap swap defaults 0 0

参考

Linux设置虚拟内存

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

题目打包下载地址

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

第一题 送分题

关注“吾爱破解论坛”微信公众号,回复指定字符串即可获得本题正确口令。

第二题 Windows 初级题

使用PEiD查壳,得知该程序是UPX壳,并修改了区段名。于是使用OD脱壳,再用ImportREConstructor修复IAT。
再次查壳,得到Borland Delphi v3.0 *。故使用IDR爱盘下载地址)进行分析。
查看窗体,定位到关键函数TForm1.edtPwdChange

其中对输入字符串进行切片,然后分别进行md5计算,并与以下字符比较:
E7EE5F4653E31955CACC7CD68E2A7839
ea6b2efbdd4255a9f1b3bbc6399b58f4
c8d46d341bea4fd5bff866a65ff8aea9
反查md5并拼接即可得到52pojie2019game
输入进行校验,得到提示:

将该字符串回复到公众号即可获得本题正确口令。

第三题 Android 初级题

使用AndroidKiller反编译,打开MainActivity.smali,发现checkFlagonClick方法被nativie化了。
于是使用IDA打开libcrack_j2c.so,定位到onClick方法,可以发现是通过JNI反射调用Java方法。由此可以大致分析出程序流程:
首先获取输入框文本,对长度进行判断,为30则调用checkFlag方法进行检查
checkFlag方法中,定位到关键位置:

由此可知,安装并打开该APP后,输入30位长度的字符串,点击确定就会调用equals方法
于是使用Frida进行hook,打印出调用该方法的参数和实例内容,从而得到真码:
ed61f6308c74bcf35c71729d4db24c
将该字符串回复到公众号即可获得本题正确口令。
Frida脚本如下:

1
2
3
4
5
6
7
8
9
10
11
if(Java.available)
{
Java.perform(function(){
var String= Java.use('java.lang.String');
String.equals.overload("java.lang.Object").implementation=function(obj){
console.log(this.toString());
console.log(obj);
return this.equals(obj);
}
});
}

此处应有分割线

祝各位身体健康,心想事成!