reverse打题(补档2)

  1. SimpleRev

查壳,无壳,ida,找到主函数

分析主函数,v4为要输入的字符,如果输入d/D,则开始进入函数。如果输入q/Q,则退出函数。若为其他字符,则会结束这个代码。

输入D/d进入函数会得到这个子函数,分析子函数

发现key,且key会和stc这个字符串数组拼接,同时存在key1和key3这两个字符串数组,最后判断时时判断text和str2是否相等,text就是key3与v9的结合,join()的作用时把一个数组中的元素放入一个字符串中,这里join(key3,v9)的意思是把v9放进key3中,这里的v9和key3的存储涉及大小端序列存储

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,存储模式类似把数据当作字符串顺序处理

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,存储模式将地址的高低和数据位权有效地结合起来。

大小端存储的作用是:地址的增长顺序与值的增长顺序相反

个人理解是数据存储是按照大端模式进行,但在读取时需要注意大小端序,下面是以char格式读取,故用时的小端序(不是很看得懂这个东西说实话)

对着v9[0]和stc[]摁r,转换成字符

得到src为’SLCDN’,v9[0]为‘wodah’

看到这里,思路完全找不到,回头去看前面,发现join函数那里好像不对,如果这里只是单纯的把v9加入到key3中,那线索就断了,果断跟进join函数,果然有问题

Join函数中a1代表key3,a2代表v9,这里先回读取a1和a2的长度,后面用dest接受malloc分配的内存,如果内存分配失败则退出函数,成功就把a2拼接到a1中,最后返回dest作为text

到这,去找key3,顺便找一下key1

可得key1=‘ADSFK’,key3=‘kills’

到这,所有的key都齐了,可得text=‘killswodah’,但要注意,key这里为小端序存储,即读取时要逆序则key=‘ADSFKSLCDN’

接着往下分析函数

后面的第一个函数是for函数,易得循环次数为10次,作用是把大写字母转换成小写字母,下一个函数

分析函数,这个函数为无限循环函数,我们要挨个输入flag,如果输入回车则结束循环,v2和v3的初始值均为0,如果输入空格则v2加1,后来会判断输入的值,不同区间会经历一样的变换,v2代表的是str2的元素号数,v3则会影响到最后的判断,到这,再去看最后的输出判断

这里会判断text和str2的关系,最后会把__readfsqword(0x28u)和11异或,把异或后的值返回

到这里,可以编写反汇编代码,python,启动

最后得到:KLDQCUDFZO

即:flag{KLDQCUDFZO}

2.刮开有奖

查壳,无壳

尝试打开文件,发现只有一个对话框,无法进行任何形式的互动

Ida打开,查找字符串,找到可疑的字符串

跟进调查,发现一段蛮长的主函数,分析函数

主要函数前面有一些判定的函数,前面的两个if没发现有什么作用,从第三个if开始,可以合理猜测flag长度为8,memset为初始化函数(看了大佬的wp),继续往下看,发现在一堆定义字符后有一个函数引用sub_4010F0,跟进调查

    又臭又长的函数,观察函数,发现这个函数是一个嵌套循环函数,两层嵌套,甚至后面还有自引用

    分析函数,发现函数是一个用于字符转换的函数,先把函数换成c,不然真看晕了

   

    运行结果

    继续往下看主函数

   

    发现v4,v5都和函数sub_401000有关系,跟进

    又臭又长,观察函数,发现下面有一个引用,跟进看看

   

    Base64,见到亲人了,因为byte_407830是base64编码表,合理猜测这个函数的作用是把v4和v5base64加密一下,手动加密

    V4base64解码得到“jMp”

    V5base64解码得到“WP1”

    跳过sub_401000函数,直接去看最终判断

       

    分析判断条件flag的第一个字符:v7[0]+34,v7[0]本来是Z,但是ascii加34后是U

    Flag的第二个字符:是v10,v10本来是第五个字符,经过加密后是J

Flag的第三个字符:v5本来是第三个字符,加密后是E,E的ascii码是69,运算后得到87,即为W

Flag的第四个字符:v13本来是第七位,加密后是Z,Z的ASCII码为,运算后得到80,即为P

Flag后面的字符:看判断条件,这里判断的是v4和v5的初始值,但v4和v5在函数里面经过了base64解密,可以合理猜测后面的flag是v4和v5base64解码后得到的字符串,易得flag:’ UJWP1jMp’

经检验,flag正确

这题了解到如果在伪代码中在函数引用前,总有一个函数,那可以合理猜测这个函数为初始化函数

DialogBoxParamA函数:这个函数从对话框模板资源创建一个模态对话框框。在显示对话框框之前,该函数将一个应用程序定义的值作为WM_INITDIALOG消息的lParam参数传递给对话框过程。应用程序可以使用该值来初始化对话框控件。说白了就是一个创建对话框口的函数

有条件的话,先把伪代码转换成自己学过,且能看懂和比较熟练的编译的语言,不然看那翻译过来不是很标准的伪代码会很头痛的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值