解出来两题,别的题目等有空再复现
reverse
easyre
re签到题,首先是查壳,AS壳,脱壳动调不起来。
ASpack脱壳
赛后学习一下如何脱壳:
第一步,运行pushad这个指令,然后发现之后esp改变了,这时候可以使用ESP定律了
第二步,在改变的esp处,右键,数据窗口跟随
第三步,下硬件断点无论选择多少个字节,只要第一个字节是esp所指向的就行,然后下硬件断点,随便是什么大小都行
第四步,F9+数次F8,遇到一个retn大跳转,跳转到奇怪的地方,右键分析,从模块中删除分析
第五步,删除断点
第六步,右键选择od脱壳插件,点击脱壳,选择地方保存即可。可以选择重建或者不重建输入表,都可以试一试。
题解
用die查看还能查看到壳
但是用exeinfope查看,已经识别不出来了
放入ida中反汇编,上面那么多的函数,只有最后一个是对输入的字符串进行转换,跟进
动调后发现,真正有效的,只有最后的异或,Str是input,与dword_492940数组异或之后,与v2数组对比
输入符合条件的字符(或者直接头铁修改汇编/flag寄存器可以)
跟进最后的sub_401771函数(tab键切换显示)
只需要在此处下断点,然后f9键,重复循环,记录下eax(注意是低位,也就是最后两位的值,伪代码界面中已规定)的值,也就动调出了dword_492940数组的值
我用x32dbg,
下面是脚本:
1 | arr = [0x38,0x78,0x0D,0xE8,0x0,0xAF,0xBF,0x3A,0x6B,0xFB,0xB8,0x0c,0x85,0x35,0x5c,0xAD,0xE6,0x0,0xE0,0x8A,0x1D,0xBD,0x46,0xD2,0x2B,0x0,0x15,0x24,0xc6,0xad,0xa1,0xc9,0x7b,0x12,0x28,0x0,0x5,0x0,0x72,0x3e,0x10,0xa1] |
DACT&{Welc0me-t0-j01n-SU-l0ve-suyug1eg1e}
crypto
FlowerCipher
1 | # python |
就是找规律
我用的是字符串“hello”的md5值进行测试的,顺带输出了随机数flower的值
截取flag括住的md5字符串,将每位的md5字符的ascii码值的三次方,与随机数flower相加后,x对其进行相乘的轮运算。
我这边就不分什么L和R了,同一就L吧
L的值经过运行,会共有33个结果,我只列出5个(别忘了R的初始值为0,得算上)
1 | 0,1,152499,152850662695,21934987200861169…… |
首先是从1得到111582这个值,
1 * (ord(“5”) ** 3 + 3622(随机数) ) + 0 == 152499
152499 * (ord(“d”) ** 3 + 2306(随机数) ) + 1 == 152850662695
152850662695 * (ord(“4”) ** 3 + 2898(随机数)) + 152499 == 21934987200861169
……
有个细节就是关于md5,ascii码的爆破,只有16个值,我们将其的三次方统计出来,然后再带入,就能避免爆破时的重复运算。
我的代码只有两段,总体来说有以下几个步骤:
- 把题目给出的L和R放入第一段代码中爆破,找出与Ln最相近(至少头5位以上相同)的那个数L
- 记录L的值,再将Ln和L放到第二段代码中算出(Ln-L)
- 颠倒次序,把Rn的值放入Ln,把(Ln-L)放入Rn
- 下一轮爆破
1 | Ln = 15720197268945348388429429351303006925387388927292304717594511259390194100850889852747653387197205392431053069043632340374252629529419776874410817927770922310808632581666181899 |
1 | L = XX |
以下是我记录的结果,也顺便把flower随机数给求出来了
1 | # 15720197268010049967757675120469992186537658494704135479561283085920610969374470767952957875436059114121446299016141673102641832905150384839824642839374686669270876487929996533 1919 0 |
flag就出来了
1 | arr = "0123456789abcdef" |
DASCTF{3e807b66ef26d38e671ddcbb9c108250}