getit

news/2024/12/4 17:11:57/

本逆向题还是源码分析,通过源码追出flag,下面步入正题

0x01源码分析

int __cdecl main(int argc, const char **argv, const char **envp)
{char v3; // al__int64 v5; // [rsp+0h] [rbp-40h]int i; // [rsp+4h] [rbp-3Ch]FILE *stream; // [rsp+8h] [rbp-38h]char filename[8]; // [rsp+10h] [rbp-30h]unsigned __int64 v9; // [rsp+28h] [rbp-18h]v9 = __readfsqword(0x28u);LODWORD(v5) = 0;while ( (signed int)v5 < strlen(s) ){if ( v5 & 1 )v3 = 1;elsev3 = -1;*(&t + (signed int)v5 + 10) = s[(signed int)v5] + v3;LODWORD(v5) = v5 + 1;}strcpy(filename, "/tmp/flag.txt");stream = fopen(filename, "w");fprintf(stream, "%s\n", u, v5);for ( i = 0; i < strlen(&t); ++i ){fseek(stream, p[i], 0);fputc(*(&t + p[i]), stream);fseek(stream, 0LL, 0);fprintf(stream, "%s\n", u);}fclose(stream);remove(filename);return 0;
}

上面是主要核心代码,其中作者的算法就在其中,通过观察代码,我们发现真正核心代码在这里

 while ( (signed int)v5 < strlen(s) ){if ( v5 & 1 )v3 = 1;elsev3 = -1;*(&t + (signed int)v5 + 10) = s[(signed int)v5] + v3;LODWORD(v5) = v5 + 1;}

所以,我们来看看这段代码,究竟它循环都干了些上面,首先观察变量的值
在这里插入图片描述

s="c61b68366edeb7bdce3c6820314b7498";
t="SharifCTF{????????????????????????????????}"

这里读者可能会有疑问,说,你这个t哪里多个S啊?其实有时候我们不能太相信IDA,IDA有时候分析会出现问题,这个IDA在分析的时候有一个字符没有显示,我们可以通过winhex看到是有S,不然到后面你会发现运行不出真正的flag
通过观察这两个变量的值,发现很奇怪啊,这明显就是flag的形式啊
那回过头来,我们在看看关键代码是怎么执行的。

0x02核心代码

LODWORD(v5) = 0;while ( (signed int)v5 < strlen(s) ){if ( v5 & 1 )v3 = 1;elsev3 = -1;*(&t + (signed int)v5 + 10) = s[(signed int)v5] + v3;LODWORD(v5) = v5 + 1;}

首先,判断v5的值和s的长度,然后下面有个if语句,v5 & 1这个运算是说,如果v5二进制数最后一位是1就返回1,是0就返回0,根据返回值不同,v3有两种值的情况。

再往下一段代码的意思就是,把字符串s的一部分值加上v3赋值给了字符串t的一部分,然后就凑出了flag了

0x03编写输出

下面是我编写的后c++代码,用来输出flag

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{int v6 = 0;int v3;char s[] = "c61b68366edeb7bdce3c6820314b7498";char t[] = "SharifCTF{????????????????????????????????}";while (v6 < strlen(s)){if (v6 & 1)v3 = 1;elsev3 = -1;t[v6 + 10] = s[v6] + v3;v6 = v6 + 1;};printf("%s", t);return 0;
}

输出结果:
在这里插入图片描述
拿到flag,over!


http://www.ppmy.cn/news/544029.html

相关文章

阶段性复习 迭代器, Lambda表达式, 泛型, 单例模式

迭代器&#xff08;Iterator&#xff09;是一种设计模式&#xff0c;用于顺序访问集合中的元素&#xff0c;而不需要了解集合内部的结构。 迭代器模式将元素的遍历行为和集合类解耦&#xff0c;使得可以在不修改集合类的情况下遍历集合。 具体来说&#xff0c;一个迭代器对…

遍历$.each()和$().each()用法

jQuery $.each(obj,function(n,value) 遍历用法 对象的遍历 js 代码部分 <script type"text/javascript">$(function() {var $tbody $("tbody");var html "";//前提必须是对象&#xff0c;一般情况下&#xff0c;后台传过来json字符串&…

$.each()和$().each(),以及forEach()的用法

1.forEach是js中遍历数组的方法&#xff0c;如下 var arr[1,2,3,4]; arr.forEach(function(val,index,arr){//val为数组中当前的值&#xff0c;index为当前值的下表&#xff0c;arr为原数组arr[index]2*val; }); console.log(arr);//结果是修改了原数组&#xff0c;为每个数乘…

forEach和$.each()以及$().each()的用法

forEach&#xff1a;即Array.prototype.forEach&#xff0c;这是ES5中对数组新增的方法&#xff0c;等同于过去的for循环遍历数组。用法&#xff1a;arr.forEach(function(value,index,array){...}),其中的function中有按个参数&#xff0c;value为数组中的值&#xff0c;index…

etags 用法

(本文参考http://www.emacs.cn/Doc/Etags&#xff0c;并根据自己的使用情况做了些微修改。) 1. etags 基本用法 在emacs里可以用etags命令生成emacs专用的tags文件&#xff0c;有了此文件之后便可以使用一些emacs tags的命令&#xff0c;比如对于编辑C/C程序的人员可以方便的定…

Easter Eggs

题目链接&#xff1a;Easter Eggs 显然可以二分。 然后怎么check呢&#xff1f;显然我们把距离小于mid的点连起来&#xff0c;那么就相当于找一个最大独立集&#xff0c;然后最大独立集的个数要大于等于n。 然后因为连边的只是蓝色和红色之间&#xff0c;所以这是一个二分图&…

$.each() 和 $(data).each()的使用

$.each() 和 $(data).each()的区别 二者都是循环的一种处理 $(data).each()主要用于DOM节点的循环&#xff0c;也可用于一个数据对象的循环&#xff0c; $.each()主要用于对数据的处理 其实两者都可以处理DOM节点和数据对象&#xff0c;只是一个使用习惯问题 $(data).each() …

each的用法

1.数组中的each 复制代码var arr [ "one", "two", "three", "four"]; $.each(arr, function(){ alert(this); }); //上面这个each输出的结果分别为&#xff1a;one,two,three,four var arr1 [[1, 4, 3], [4, 6, 6…