攻防世界Reversing-x64Elf-100做法(简单易懂版)

首先,最基本的,先查壳,发现是64bit的,那就拖进ida64中a7f3e900afb74475bfbf9cd7f2ac937d.png用ida64打开后是这样的5ca0043b2e0c4f9c8faaa224b46a5502.png直接进入main函数,然后就简单的分析一下,写点注释,抓个重点,if判断的语句,若条件满足就incorrect,不满足就输出nice,那么括号内的条件就不能满足了,然后进入这个函数看看23341645fd524b9dbc80c8f77406bd61.png发现是一个简单的算法,注意,这个函数的返回值必须为0才行,然后分析代码喽,发现这边定义字符数组的方式有点奇怪,与我们通常在c语言中定义的不太一样,那这边我们就要大胆猜测喽,这,这其实可以约等于一个二维数组,但那不好想,索性直接看成三个字符数组,这三个数组地址连续,然后往下看v3代表的是地址,*(v3[i%3]+2*(i/3)),这句话,很关键!首先我们看到外面的那个*,这个代表取用该对象所指的数,而且该对象必须是指针,那这说明什么?整个圆括号内的东西,都是在代表一个指针所指的位置,拆开来看,i%3,结果有0,1,2,就代表前面重拆成的三个字符数组,再看后面,2*(i/3),代表某数组的具体字符位置,最后半句话,*(i+a1),注意这边也有*哦,所以此处也是取个数,而不是对数进行操作,这边举个例子吧,假设i=0,i%3=0,那就取数组v0(将这三个数组重新命名,分别为v0,v1,v2),然后2*(i/3)=0,就取该数组的第0位,也就是D,以此类推,最后上代码


#include<stdio.h>
int main() {
    char str1[] = "Dufhbmf";
    char str2[] = "pG`imos";     //拆成三个数组,str1,str2,str3
    char str3[] = "ewUglpt";
    char result;
    for (int i = 0; i <= 11; i++) {
        if (i % 3 == 0) {
            result = str1[2 * (i / 3)] - 1;
        }
        else if (i % 3 == 1) {
            result = str2[2 * (i / 3)] - 1;
        }
        else {
            result = str3[2 * (i / 3)] - 1;
        }
        printf("%c", result);
    }
    return 0;
}

就运行出flag了,最后总结一下,看到*一定要敏感,这是对指针操作的符号,不是对数操作,做到最后发现,也就是一个简单的小算法,但其实往往会错在没有看到或者理解*,下次优先注意,还愣着干嘛,拿出小本本记上啊!

 

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值