buuctf SimpleRev

前言:学习笔记

常规思路: 下载 解压 查壳

64>>>拉入 64 IDA Pro

常规思路: 查找字符串>>>main

东点点西看看 = =

看完之后再反。

main()>>>

Decry()点进去【当然你东点点西看看的时候肯定也进去了。】

进去原因:main(中没有可用的、有价值的信息、而Decry() C语言中,好像没有这个Decry()吧,说明这是自定义函数。

正向分析:

第一部分:

为什么src 和 v9 要反着来? 小端序啊!

为什么知道它是小端序?

 

字节序 LE>>>小端序 BE>>>大端序>>>【查壳的时候说了啊!】

大端序  12 34 56 78 (日常所见)

小端序  78 56 34 12   (接触 C、汇编、应该不得陌生哦)

为什么 key3 key1 不反着来? 

不懂,没关系。

理解为>>>hift+F12查找的>>>查找字符串,其查找的字符直接用就行。

第二部分:

大小写转换!

emmm C语言 写过类似练习,,,

你就看作key[v3%v5] <=> key[i] +32       “ % ”   取模 取余都是它 !! 

32dec>>>20h 

在ASCII码表中 大小写 相差20h 32dec (王爽老师汇编语言有提过。)

第三部分:

总结:

text = (已知)

key = (已知)

key进行了 大小写转换。

if T >> str2 = text >>> True flag!

str2的算法中 key[XXX] -XX + XX ...都是已知的。只有v1是外界获取来的【getchar()】,so?>>>v1的值就是flag。

而v1的范围(已知)那么重点就是求v1的值。

C逆向脚本(严格来说,我自己感觉不是逆向脚本。。。)

编写思路:

正向中,首先进行了 key的大小写转换,然后再带入后面的算法当中去执行。

那么,我们首先第一步就是 大小写转换。

第二步>>进行算法的执行(或者说 爆破 求v1具体的值)

因为 text = str2 

所以 只需要 判断 text[i] == (v1 - 39 - key[v3 % v5] + 97) % 26 + 97; 即可

则>>>strlen(text)的长度为外层循环【   因为是对text[i]的爆破  】

内层循环就是v1的取值返回。

v1的范围已知的哦!(第三遍了好像。。。哈哈哈)

第一步:大写->小写

python的.lower()直接就转了。靠了, 还是python简单。

第二步:求爆破求v1的值。

简单点直接取整个ASCII码表再进行细分【先粗后细】

细:v1的范围是 A~Z a~z (正向分析 得来的。)

###不过注意点 C中 不能写成 A<=v1<=Z || a<=v1<=z 这种格式!!不可以! 原因好像是二元啥的 忘了。。

欧克 flag{v1};

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值