快速为PDF制作高质量书签(目录)

网络上有寄书扫描的服务,不过扫描后,制作PDF书签的费用,比扫书还贵。有书签阅读会更方便,研究了一下自己快速制作高质量书签的方法,在这里分享一下。

1. 用到的工具

  • FreePic2Pdf
  • PdgCntEditor
  • 一个支持正则表达式替换的文本编辑器,如Visual Studio Code

2. 从豆瓣提取现成目录

自己手动把条目一个个做出来,时间成本太高了。这里是通过编辑现成的目录,导入自己的PDF。找现成目录,一个途径是豆瓣,另一个方法是找别人做好的PDF。如果两个途径都找不到,还是花钱给扫书的人做吧。

本文通过豆瓣提供的目录制作书签,至于如何从别的PDF提取,再导入,会利用豆瓣做,那你就会了从别的PDF导入了。

豆瓣图书详情页,有非常完美的目录,可以直接复制下来,通过文本编辑器的正则表达式替换格式化。

  • 首先,格式化为PdgCntEditor所支持的页码表示法

即页码,跟名称,以一个制表符分隔,豆瓣提供的是以“空格”分隔,通过以下正则匹配(不包括单引号,注意空格,下同):

替换为:

  • 多级目录缩进

使用制表符缩进,二级缩进一位,三级两位,以此类推

    • 二级目录,“1.1 ”这种格式开头的替换规则:

    • 三级目录,“1.1.1”这种格式开头的替换规则:

更多级别、或者其他格式的,以此类推,修改下匹配规则和替换内容即可。如果有些无法正则解决的,一般来说正则替换后,剩余还没完成修改的条目应该很少了,可以手动修正。

  • 编辑第一页前的页码

用PDF阅读器打开,查看正文第一页,是PDF所有页中的第几页,然后正文前的书签的页码,就是其在PDF中的页码-正文第一页在PDF中的页码,例如正文第1页,是PDF的第22页,那封面的页码就是-21。

  • 格式大致如下

3. 编辑接口文件

运行FreePic2Pdf,点击右下角的“更改PDF”,然后切换到“从PDF取书签”,选择要编辑目录的PDF文件,然后点击开始,正常情况下,会显示“导出完成”:

点击“2、存放接口文件的文件夹”右侧的“编辑书签”按钮(下图红圈处):

把格式化后的目录文本,粘贴进去,然后点击左上角的保存按钮(下图红圈处):

点击“编辑接口文件”按钮:

更改其中BasePage的值为书籍正文第一页在PDF中的页数:

然后保存,关闭“编辑接口文件”的窗口。

退出其余打开了此PDF的程序,然后切换到“往PDF挂书签”标签,点击“开始”:

完成后,PDF即可得到一个内容完整、结构完好的书签:

FineReader MRC压缩的问题

网络上没找到此问题相关的内容,所以在这分享下解决方法,以帮助其他遇到此问题的人。

发现用Adobe Reader打开自己用FineReader生成的一个“可搜索PDF”,浏览起来非常卡,页面内容加载极慢,选取内容时,整个页面要闪烁一两下,才能选择,这浏览体验还不如未OCR前的。

阅读别人FineReader OCR的电子书,并没遇到这样的情况,所以应该与FineReader的设置有关。

研究了一下,发现是“MRC压缩”的问题,在“工具-选项-格式设置”中,把“使用MRC压缩(需要OCR)”关闭,生成的PDF即可正常阅读:

2019 九月 广东强网杯 CTF 部分题 Writeup

MISC

抓灰阔

下载misc4.pcap,用Wireshark打开,前面部分的HTTP请求是明文的,到了后面变成了密文。
从序号69的数据包可得知黑客登入Tomcat部署了一个war文件:

提取war,其中有个main.jsp文件,内容如下:

根据其中的代码,可知后面的post body经过加密,并且作为Java Class文件加载解密后的内容,调用其中的equal()方法,从序号154的数据包提取密码:ba4ae3277932b0a2,如图:

编写Java代码对后面的post body以及服务器的response body进行解密以及main.jsp,得知post body为加密后的Java Class文件。
编写Java程序解密post body,逐个解密POST请求:

反编译解密后的Class文件,从中可知使用了同一个密码加密response body,只是加密后没进行Base64编码,编写解密response body的代码,逐个解密response body:

经过对解密的Class文件和服务器的Response内容,可知黑客在序号245的数据包的提交的Java Class的content静态属性中附带了一份Base64编码的flag文件:

Base64解码后得文件flag,用file查看文件类型报错,好像是一个头部不正确的ELF文件(WinHex窗口中的第五、六和七字节):

通过WinHex对照正确的ELF头修正第五、六和七字节保存后可正常运行。

运行后输出“where is flag”,输入东西后程序会退出。

我还没搞过逆向,搞了接近一个小时,连IDA Pro都没能成功启动,然后把文件丢给队友研究了,所以此题下面部分是队友的操作:

运行程序输出where is flag,输入东西后按Enter程序退出,使用IDA Pro进行反汇编,找到关键语句,将输入的字符与一个longlong变量转为byte后进行判断,相同则调用函数,进行一些计算输出flag:

将longlong转为ASCII得到oo8?989j,运行并输入得到flag:

Web

XX?

网站打开是一个搜索引擎,摸不着头脑,尝试index.php,可以访问,队友使用扫描工具扫描站点文件,发现index.php~可以看到源码:

经过源码,查找资料可知simplexml_import_dom()存在可利用的XXE,编写PHP程序向程序POST构造的XML内容,得flag:

免费的,ping一下~

经测试,系统过滤了空格,|,&,flag,cat,sed,tail等字符和字符串,但没过滤分号:

经过查找资料,得知可通过${IFS}代替空格,通过ls查找到flag的路径,构造cat读取文件,输出不在第一行:

构造sed读取第二行,输出不在第二行:

怒读最后一行,得flag:

PHP

访问index.php查看到程序源码,得知程序使用正则表达式过滤了部分字符,但没过滤取反,因此使用PHP构造通过取反调用GetYouFlag的参数:

最后访问:
http://119.61.19.212:8082/index.php?code=$啊=~%B8%9A%8B%A6%90%8A%8D%B9%93%9E%98;$啊();
得flag:

API

这题比赛结束后拿到源码后才写出答案的,感觉这题有点坑,有几个人能猜得到filename参数中的json对象中的文件名,要以file为key呢?

答案:

 

Windows远程桌面自定义证书

首先准备需要使用的证书,如果证书不是PKCS #12格式的,需要先转换,可以通过OpenSSL完成:

执行certlm.msc(注意不是certmgr.msc),打开本地计算机的证书管理器:

转到个人证书,在窗口右边空白处右键 – 所有任务 – 导入:

然后选择PKCS #12格式的证书文件进行导入。

 

导入完毕后,在证书列表双击导入后的证书,查看其指纹,并复制:

 

接下来以管理员身份执行cmd或者powershell,执行命令:

见到“successful”字样的话,那就恭喜你啦!

PHP HTTP $_(REQUEST|GET|POST)数据不完整(数量不足)问题

有个页面需要给PHP POST大量的数据,最近发现只有固定数量的数据可以保存到数据库,其余的数据提交上去后,完全无反应。

输出原始POST数据,无问题,但输出$_REQUEST,却发现一条记录后面的数据全丢了。

 

查了下资料,原来PHP有限制$_REQUEST/GET/POST/COOKIE数组的成员数量:http://php.net/manual/en/info.configuration.php#ini.max-input-vars

 

编辑php.ini,增大max_input_vars的值,重启PHP服务,即可解决。